javascript - 如何使用 Javascript 在单个对象中映射多个对象数据?

标签 javascript object vuejs2

var sourceA = [{ pid: 1, data_a: 23, data_x: 23},{ pid: 2, data_a: 23 ,data_x: 23}];

var sourceB = [{ pid: 1, data_a: 34, data_x: 34 },{ pid: 2, data_a: 34, data_x: 34 }];

var sourceC = [{ pid: 1, data_a: 35, data_x: 34 },{ pid: 2, data_a: 35, data_x: 34 }];

我正在从多个来源获取以下数据。在那些对象中有一个字段 PID,其中一个是常见的。所以,我想按照PID来组合。

预期输出:

var p = [{
  "pid": 1,
  "array": [{"data_a": 33,"data_x": 30},{"data_a": 33,"data_x": 30},{"data_a": 33,"data_x": 30}]
},{
  "pid": 2,
  "array": [{"data_a": 33,"data_x": 30},{"data_a": 33,"data_x": 30},{"data_a": 33,"data_x": 30}]
}]

我尝试了以下

 var result = sourceA.map((obj, index) => Object.assign({}, sourceA[index], sourceB[index], sourceC[index]));

但我没有得到我期望的结果。然后我尝试了 How to group array of objects by key 但我的来源是 3 而不是 1。

最佳答案

var p = [{
  "pid": 1,
  "array": [{"data_a": 33,"data_x": 30},{"data_a": 33,"data_x": 30},{"data_a": 33,"data_x": 30}]
},{
  "pid": 2,
  "array": [{"data_a": 33,"data_x": 30},{"data_a": 33,"data_x": 30},{"data_a": 33,"data_x": 30}]
}]

由于您的问题并不清楚我们可以得到“33”和“30”值,我假设您打错了字,预期结果应该是这样的:

var p = [{
  "pid": 1,
  "array": [{"data_a": 23,"data_x": 23},{"data_a": 34,"data_x": 34},{"data_a": 35,"data_x": 34}]
},{
  "pid": 2,
  "array": [{"data_a": 23,"data_x": 23},{"data_a": 34,"data_x": 34},{"data_a": 35,"data_x": 34}]
}]

考虑到上述情况,您可以尝试使用少量循环按 pid 对数据进行分组,然后按预期对其进行格式化

var sourceA = [{ pid: 1, data_a: 23, data_x: 23},{ pid: 2, data_a: 23 ,data_x: 23}];
var sourceB = [{ pid: 1, data_a: 34, data_x: 34 },{ pid: 2, data_a: 34, data_x: 34 }];
var sourceC = [{ pid: 1, data_a: 35, data_x: 34 },{ pid: 2, data_a: 35, data_x: 34 }];

function combineInputs(...inputs) {

  var combined = {};
  for (var i = 0; i< inputs.length; i++) {
    for (var j = 0; j < inputs[i].length; j++) {
      var record = inputs[i][j];

      if (!combined[record.pid]) {
        combined[record.pid] = []
      }
      var tmp = Object.assign({}, record);
      delete tmp.pid;
      combined[record.pid].push(tmp);
    }
  }

  var result = [];
  for (var key in combined) {
    if (combined.hasOwnProperty(key)) {
      result.push({
        pid: key,
        array: combined[key]
      });
    }
  }

  return result;
}

var expected = combineInputs(sourceA, sourceB, sourceC);
console.log(expected);

结果应该和预期的一样。这可能不是最好的解决方案,但它有效

关于javascript - 如何使用 Javascript 在单个对象中映射多个对象数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46466998/

相关文章:

electron - VUE路由器无法与两个Electron BrowserWindow一起使用

javascript - tippy.js 工具提示不响应 CSS 样式

javascript - 如何以数字和字母组合的形式显示javascript对象的值?

javascript - vue.js 不适用于我的第一个测试 html 页面

typescript - 如何使用 TypeScript 在 Vue.js 中使用计算 Prop ?

javascript - 使用正则表达式计算对象中的数组项

javascript - typescript /Node : Error [ERR_MODULE_NOT_FOUND]: Cannot find module

javascript - 使用 Canvas HTML 生成 map 网格和图像的问题

Javascript 命名空间和私有(private)变量

java - 难以理解类对象和构造函数