Javascript for/in 循环 - 连接来自两个不同对象的项目?
Javascript for/in loop - join items from two different objects?
我在下面有这些数据集,我想合并每组中的数据:
var data = {};
var datasets = [
{"_id":"58d6c806d7c80d5d44a35204","particles":{"timestamp":[1490470918708,1490470962915,1490470967186],"Particles":["108","108","109"]}},
{"_id":"58d6caf62552b75f26f56f91","particles":{"timestamp":[1490471670888,1490473309103],"Particles":["109","100"]}}
];
datasets.forEach(function(dataset, index) {
for (var key in dataset.particles) {
data[key] = dataset.particles[key];
}
});
console.log(data);
结果:
{ timestamp: [ 1490471670888, 1490473309103 ],
Particles: [ '109', '100' ] }
他们没有加入。我追求的结果:
{ timestamp: [ 1490470918708,1490470962915,1490470967186, 1490471670888, 1490473309103 ],
Particles: [ '108','108','109', '109', '100' ] }
有什么想法吗?
编辑
当涉及非常大数据时,concat
或push
是否更快?
您必须连接数组,而不仅仅是分配值。
var data = {};
var datasets = [
{"_id":"58d6c806d7c80d5d44a35204","particles":{"timestamp":[1490470918708,1490470962915,1490470967186],"Particles":["108","108","109"]}},
{"_id":"58d6caf62552b75f26f56f91","particles":{"timestamp":[1490471670888,1490473309103],"Particles":["109","100"]}}
];
datasets.forEach(function(dataset, index) {
for (var key in dataset.particles) {
// Check if key already exists.
if( data[key] === undefined )
data[key] = [];
// Add current timestamps.
data[key] = data[key].concat(dataset.particles[key]);
}
});
console.log(data);
希望这是需要的:
var data = {};
var datasets = [{
"_id": "58d6c806d7c80d5d44a35204",
"particles": {
"timestamp": [1490470918708, 1490470962915, 1490470967186],
"Particles": ["108", "108", "109"]
}
},
{
"_id": "58d6caf62552b75f26f56f91",
"particles": {
"timestamp": [1490471670888, 1490473309103],
"Particles": ["109", "100"]
}
}
];
var output = {
}
datasets.forEach(function(dataset, index) {
for (var key in dataset.particles) {
if (typeof output[key] == 'undefined') {
output[key] = []
}
//console.log(dataset.particles[key])
for (var k of dataset.particles[key]) {
output[key].push(k)
}
}
});
console.log(output);
在 函数式编程 风格中,您可以使用 reduce
和 Object.keys
:
var datasets = [
{"_id":"58d6c806d7c80d5d44a35204","particles":{"timestamp":[1490470918708,1490470962915,1490470967186],"Particles":["108","108","109"]}},
{"_id":"58d6caf62552b75f26f56f91","particles":{"timestamp":[1490471670888,1490473309103],"Particles":["109","100"]}}
];
var data = datasets.reduce ( (acc, {particles}) =>
Object.keys(particles).reduce ( (acc, key) =>
(acc[key] = (acc[key] || []).concat(particles[key]), acc), acc
), {} );
console.log(data);
.as-console-wrapper { max-height: 100% !important; top: 0; }
替代 push
而不是 concat
,以防性能出现问题:
var datasets = [
{"_id":"58d6c806d7c80d5d44a35204","particles":{"timestamp":[1490470918708,1490470962915,1490470967186],"Particles":["108","108","109"]}},
{"_id":"58d6caf62552b75f26f56f91","particles":{"timestamp":[1490471670888,1490473309103],"Particles":["109","100"]}}
];
var data = datasets.reduce ( (acc, {particles}) =>
Object.keys(particles).reduce ( (acc, key) =>
((acc[key] = (acc[key] || [])).push(...particles[key]), acc), acc
), {} );
console.log(data);
.as-console-wrapper { max-height: 100% !important; top: 0; }
但是请注意,在这个版本的代码中,push
将获取 particles[key]
中的每个单独的数组元素作为参数,这些元素占用堆栈 space,而堆栈又是有限的。参见 "Is there a max number of arguments JavaScript functions can accept?"。您可以通过对 particles[key]
中的每个单独元素执行单独的 push
调用来克服此限制,但这会降低性能。所以最后你可以使用 concat
版本更好。
我在下面有这些数据集,我想合并每组中的数据:
var data = {};
var datasets = [
{"_id":"58d6c806d7c80d5d44a35204","particles":{"timestamp":[1490470918708,1490470962915,1490470967186],"Particles":["108","108","109"]}},
{"_id":"58d6caf62552b75f26f56f91","particles":{"timestamp":[1490471670888,1490473309103],"Particles":["109","100"]}}
];
datasets.forEach(function(dataset, index) {
for (var key in dataset.particles) {
data[key] = dataset.particles[key];
}
});
console.log(data);
结果:
{ timestamp: [ 1490471670888, 1490473309103 ],
Particles: [ '109', '100' ] }
他们没有加入。我追求的结果:
{ timestamp: [ 1490470918708,1490470962915,1490470967186, 1490471670888, 1490473309103 ],
Particles: [ '108','108','109', '109', '100' ] }
有什么想法吗?
编辑
当涉及非常大数据时,concat
或push
是否更快?
您必须连接数组,而不仅仅是分配值。
var data = {};
var datasets = [
{"_id":"58d6c806d7c80d5d44a35204","particles":{"timestamp":[1490470918708,1490470962915,1490470967186],"Particles":["108","108","109"]}},
{"_id":"58d6caf62552b75f26f56f91","particles":{"timestamp":[1490471670888,1490473309103],"Particles":["109","100"]}}
];
datasets.forEach(function(dataset, index) {
for (var key in dataset.particles) {
// Check if key already exists.
if( data[key] === undefined )
data[key] = [];
// Add current timestamps.
data[key] = data[key].concat(dataset.particles[key]);
}
});
console.log(data);
希望这是需要的:
var data = {};
var datasets = [{
"_id": "58d6c806d7c80d5d44a35204",
"particles": {
"timestamp": [1490470918708, 1490470962915, 1490470967186],
"Particles": ["108", "108", "109"]
}
},
{
"_id": "58d6caf62552b75f26f56f91",
"particles": {
"timestamp": [1490471670888, 1490473309103],
"Particles": ["109", "100"]
}
}
];
var output = {
}
datasets.forEach(function(dataset, index) {
for (var key in dataset.particles) {
if (typeof output[key] == 'undefined') {
output[key] = []
}
//console.log(dataset.particles[key])
for (var k of dataset.particles[key]) {
output[key].push(k)
}
}
});
console.log(output);
在 函数式编程 风格中,您可以使用 reduce
和 Object.keys
:
var datasets = [
{"_id":"58d6c806d7c80d5d44a35204","particles":{"timestamp":[1490470918708,1490470962915,1490470967186],"Particles":["108","108","109"]}},
{"_id":"58d6caf62552b75f26f56f91","particles":{"timestamp":[1490471670888,1490473309103],"Particles":["109","100"]}}
];
var data = datasets.reduce ( (acc, {particles}) =>
Object.keys(particles).reduce ( (acc, key) =>
(acc[key] = (acc[key] || []).concat(particles[key]), acc), acc
), {} );
console.log(data);
.as-console-wrapper { max-height: 100% !important; top: 0; }
替代 push
而不是 concat
,以防性能出现问题:
var datasets = [
{"_id":"58d6c806d7c80d5d44a35204","particles":{"timestamp":[1490470918708,1490470962915,1490470967186],"Particles":["108","108","109"]}},
{"_id":"58d6caf62552b75f26f56f91","particles":{"timestamp":[1490471670888,1490473309103],"Particles":["109","100"]}}
];
var data = datasets.reduce ( (acc, {particles}) =>
Object.keys(particles).reduce ( (acc, key) =>
((acc[key] = (acc[key] || [])).push(...particles[key]), acc), acc
), {} );
console.log(data);
.as-console-wrapper { max-height: 100% !important; top: 0; }
但是请注意,在这个版本的代码中,push
将获取 particles[key]
中的每个单独的数组元素作为参数,这些元素占用堆栈 space,而堆栈又是有限的。参见 "Is there a max number of arguments JavaScript functions can accept?"。您可以通过对 particles[key]
中的每个单独元素执行单独的 push
调用来克服此限制,但这会降低性能。所以最后你可以使用 concat
版本更好。