将 JavaScript 数组与多个子值组合 (Node.js / NVD3)

Combine JavaScript array with multiple sub-values (Node.js / NVD3)

我正在尝试设置 Node.js API 将 JSON 数据发送到客户端以用于 NVD3 图表。该图表接受以下格式的 JSON 输入:

[  
   {  
      "key”:”KEY NAME“,
      "values":[  
         [  
            1138683600000,
            14.212410956029
         ],
         [  
            1141102800000,
            13.973193618249
         ]
      ]
   },
   {  
      "key”:”KEY NAME“,
      "values":[  
         [  
            1138683600000,
            7.1590087090398
         ],
         [  
            1141102800000,
            7.1297210970108
         ]
      ]
   }
]

但是,我的 Node 程序目前以这种格式输出 JSON:

[  
   {  
      "key”:”SAME KEY NAME”,
      "values":[  
         1510148301000,
         34
      ]
   },
   {  
      "key”:”SAME KEY NAME”,
      "values":[  
         1509626301000,
         55
      ]
   },
   {  
      "key”:”SAME KEY NAME“,
      "values":[  
         1509539901000,
         62
      ]
   },
   {  
      "key”:”DIFFERENT KEY NAME“,
      "values":[
         1509453501000,  
         58
      ]
   }
]

我想合并任何 "key" 与其他索引相同的索引,并以指定格式将 "values" 彼此合并。我到处搜索以找到执行此操作的方法,但我遇到的每种方法都没有说明 "value" 索引中的多个配对。

关于我如何做到这一点有什么建议吗?

谢谢!

您可以使用 Array.prototype.reduce to accumulate the items from your original array into an object keyed uniquely by the item's key-value. Since this leaves you with an Object instead of an array, you can then use Object.values 吐出值数组,就像您的示例输出一样。

let data = [  
   {"key":"A", "values":[1510148301000, 34]},
   {"key":"A", "values":[1509626301000, 55]},
   {"key":"A", "values":[1509539901000, 62]},
   {"key":"B", "values":[1509453501000, 58]},
   {"key":"B", "values":[1509453501001, 57]},
];

let combined = Object.values(data.reduce((accumulator, item) => {
  if (!accumulator[item.key])
    accumulator[item.key] = {key: item.key, values: []};
  accumulator[item.key].values.push(item.values);
  return accumulator;
}, {}));

console.log(combined);

我不确定你想要什么(合并?),但它似乎是这样的:

  function combine (obj) {
    var combined = {}
    for (let key in obj) {
      if (obj.hasOwnProperty(key)) {
        if (!!combined[key]) {
          combined[key] = [].concat(combined[key], obj[key].values) // everything in one
          // or
          // combined[key].push(obj[key].values) // everything in distinct arrays
        } else {
          combined[key] = obj[key].values
          // or 
          // combined[key] = [obj[key].values]  // in distinct arrays
        }
      }
    }
    return combined
  }
var original=[{"key":"SAME KEY NAME","values":[1510148301000,34]},{"key":"SAME KEY NAME","values":[1509626301000,55]},{"key":"SAME KEY NAME","values":[1509539901000,62]},{"key":"DIFFERENT KEY NAME","values":[1509453501000,58]}];
var result=[];
var isAlreadyAdded=false;

original.forEach(function(outerObj){
 var newObj={};
 var values=[];
    original.forEach(function(element) {

        if(newObj["key"] !== outerObj.key){ 
          newObj["key"]=element.key;
         values=[];
          values.push(element["values"]);
        }else if(outerObj.key ===element.key ){
        values.push(element["values"]);
    }

    });
  newObj["values"]=values;
  var count=0;
  result.push(newObj);
});

var temp=[];
result=result.filter((x, i)=> {
  if (temp.indexOf(x.key) < 0) {
    temp.push(x.key);
    return true;
  }
  return false;
})
console.log(result);