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/