【问题标题】:Combine JavaScript array with multiple sub-values (Node.js / NVD3)将 JavaScript 数组与多个子值组合(Node.js / NVD3)
【发布时间】:2017-11-10 03:57:49
【问题描述】:

我正在尝试设置一个 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
      ]
   }
]

我想合并任何与其他索引相同的“键”索引,并以指定的格式将“值”相互合并。我到处搜索以找到一种方法来做到这一点,但我遇到的每种方法都没有考虑到“价值”索引中的多个配对。

关于如何做到这一点的任何建议?

谢谢!

【问题讨论】:

  • 合并数组中的值还是相加?

标签: javascript arrays json node.js nvd3.js


【解决方案1】:

您可以使用Array.prototype.reduce 将原始数组中的项目累积到由项目的键值唯一键控的对象中。由于这会给您留下 Object 而不是数组,因此您可以使用 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);

【讨论】:

  • @pirs Object.values 自 v7.0(一年多前发布)以来一直在 NodeJS 中,我假设 OP 没有运行旧的 NodeJS 实例。
  • 我说因为我在节点 v8.6 上遇到了Object.entries 的问题,所以它有点接近了。欢呼
  • 完美,谢谢!这在没有 for 循环的情况下完成了这个技巧,所以我猜它也是最有效的。
【解决方案2】:

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

  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
  }

【讨论】:

    【解决方案3】:
    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);
    

    【讨论】:

      猜你喜欢
      • 2019-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-15
      • 2019-03-01
      • 2019-06-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多