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>