Javascript Key/Value 与数组配对
Javascript Key/Value Pairing with Arrays
我正在努力思考如何在结构上完成这样的事情:
var keywordDataProducts =
[
{"keyword" : "keyword1", "list" : [ "DP1", "DP2" ] },
{"keyword" : "keyword2", "list" : [ "DP1" ] }
];
当然,没有对值进行硬编码。例如,我们目前循环遍历所有 DP 值(DP1、DP2、DP3 等)——它们都有 0-M 关键字。我正在尝试创建一个反向查找,您可以在其中获取使用特定关键字的所有 DP。我有完美使用上述结构的代码,但我只需要更动态地填充数据。
我是否初始化了var keywordDataProducts = [];声明中包含任何内容,或定义具有关键字和列表(这是一个数组)的结构?还是将其保留为一个什么都没有的数组,并在添加项目时定义它?
我听说关联数组可以用于这种情况,但目前我还不太了解。我也见过使用 {} 的对象,但那里没有推送,我需要一个关键字数组,其中还包含 DP 数组(列表)。想法?
你会做这样的事情,但你没有清楚地描述输入是什么样的以及你正在寻找什么输出。
function fn (input) {
var ouput = {};
input.forEach( function (DP) {
for (prop in DP) {
if (DP.hasOwnProperty(prop) {
if (output[prop]) {
output[prop].push(DP);
} else {
output[prop] = [DP];
}
}
}
});
return output;
}
这需要这种输入
[{"alpha":...}, {"beta":..., "delta":...}, {"alpha":..., "gamma":...}]
和returns
{"alpha":[{"alpha":...}, {"alpha":..., "gamma":...}]}, "beta":{"beta":..., "delta":...}, "delta":{"beta":..., "delta":...}, "gamma":{"alpha":..., "gamma":...}}
您可以将对象视为关联数组,而不必使用 "push" 添加新元素。
// Create your object like this
var keywordDataProducts =
{
"keyword1" : { "list" : [ "DP1", "DP2"] },
"keyword2" : { "list" : [ "DP1" ] }
};
// Treat it like an associative array
var keyword1 = keywordDataProducts["keyword1"];
alert("keyword1 = " + keyword1.list.join(", "));
// Add to it like this
keywordDataProducts["keyword3"] = { "list" : ["DP3", "DP4"] };
// See the new object includes your new keyword
alert(JSON.stringify(keywordDataProducts));
// To iterate the keys of your object, you can do something like this
for(var item in keywordDataProducts)
{
if(keywordDataProducts.hasOwnProperty(item))
{
alert(item);
}
}
你可以在这里看到fiddle;
https://jsfiddle.net/gksjtwr6/2/
我不知道你想要怎样的输出,所以我只是创建了一个对象,每个关键字作为它自己的 DP 值键。
var data = [{dp: "dp1", keys: ["key1", "key2", "key3"]}, {dp: "dp2", keys: ["key1", "key2", "key3"]}, {dp: "dp3", keys: ["key1", "key2", "key3"]},];
function keyWordArray(arr) {
var newObj = {};
arr.forEach((obj) => {
obj.keys.forEach((keyVal) => {
if(newObj.hasOwnProperty(keyVal)){
newObj[keyVal].dp.push(obj.dp);
} else {
newObj[keyVal] = {dp:[obj.dp],};
}
});
});
return newObj;
}
document.getElementById("data").innerHTML = JSON.stringify(keyWordArray(data));
<div id="data">
</div>
我正在努力思考如何在结构上完成这样的事情:
var keywordDataProducts =
[
{"keyword" : "keyword1", "list" : [ "DP1", "DP2" ] },
{"keyword" : "keyword2", "list" : [ "DP1" ] }
];
当然,没有对值进行硬编码。例如,我们目前循环遍历所有 DP 值(DP1、DP2、DP3 等)——它们都有 0-M 关键字。我正在尝试创建一个反向查找,您可以在其中获取使用特定关键字的所有 DP。我有完美使用上述结构的代码,但我只需要更动态地填充数据。
我是否初始化了var keywordDataProducts = [];声明中包含任何内容,或定义具有关键字和列表(这是一个数组)的结构?还是将其保留为一个什么都没有的数组,并在添加项目时定义它?
我听说关联数组可以用于这种情况,但目前我还不太了解。我也见过使用 {} 的对象,但那里没有推送,我需要一个关键字数组,其中还包含 DP 数组(列表)。想法?
你会做这样的事情,但你没有清楚地描述输入是什么样的以及你正在寻找什么输出。
function fn (input) {
var ouput = {};
input.forEach( function (DP) {
for (prop in DP) {
if (DP.hasOwnProperty(prop) {
if (output[prop]) {
output[prop].push(DP);
} else {
output[prop] = [DP];
}
}
}
});
return output;
}
这需要这种输入
[{"alpha":...}, {"beta":..., "delta":...}, {"alpha":..., "gamma":...}]
和returns
{"alpha":[{"alpha":...}, {"alpha":..., "gamma":...}]}, "beta":{"beta":..., "delta":...}, "delta":{"beta":..., "delta":...}, "gamma":{"alpha":..., "gamma":...}}
您可以将对象视为关联数组,而不必使用 "push" 添加新元素。
// Create your object like this
var keywordDataProducts =
{
"keyword1" : { "list" : [ "DP1", "DP2"] },
"keyword2" : { "list" : [ "DP1" ] }
};
// Treat it like an associative array
var keyword1 = keywordDataProducts["keyword1"];
alert("keyword1 = " + keyword1.list.join(", "));
// Add to it like this
keywordDataProducts["keyword3"] = { "list" : ["DP3", "DP4"] };
// See the new object includes your new keyword
alert(JSON.stringify(keywordDataProducts));
// To iterate the keys of your object, you can do something like this
for(var item in keywordDataProducts)
{
if(keywordDataProducts.hasOwnProperty(item))
{
alert(item);
}
}
你可以在这里看到fiddle; https://jsfiddle.net/gksjtwr6/2/
我不知道你想要怎样的输出,所以我只是创建了一个对象,每个关键字作为它自己的 DP 值键。
var data = [{dp: "dp1", keys: ["key1", "key2", "key3"]}, {dp: "dp2", keys: ["key1", "key2", "key3"]}, {dp: "dp3", keys: ["key1", "key2", "key3"]},];
function keyWordArray(arr) {
var newObj = {};
arr.forEach((obj) => {
obj.keys.forEach((keyVal) => {
if(newObj.hasOwnProperty(keyVal)){
newObj[keyVal].dp.push(obj.dp);
} else {
newObj[keyVal] = {dp:[obj.dp],};
}
});
});
return newObj;
}
document.getElementById("data").innerHTML = JSON.stringify(keyWordArray(data));
<div id="data">
</div>