如何比较多个对象数组并添加新属性以及找到对象的次数以及找到对象的数组索引?
对象比较必须由 var req = http.get('url', (res) => {
var body = "";
res.on("data", (chunk) => {
body += chunk
});
res.on("end", () => {
var result = JSON.parse(body);
callBack(result)
});
}).on("error", (error) => {
callBack(err);
});
属性进行。
示例:
name
执行后,上面数组中的对象应具有以下属性:
var arrays = [
[
{
name: 'aa',
value: 1
},
{
name: 'ab',
value: 2
},
{
name: 'ac',
value: 3
},
{
name: 'aa',
value: 1
}
],
[
{
name: 'aa',
value: 1
},
{
name: 'ab',
value: 2
},
],
[
{
name: 'ac',
value: 3
},
{
name: 'aa',
value: 1
}
]
]
基本上我想检查其他数组中是否存在具有特定[
[
{
name: 'aa',
value: 1,
occurrences: 3,
where: [0, 1, 2]
},
{
name: 'ab',
value: 2,
occurrences: 2,
where: [0, 1]
},
{
name: 'ac',
value: 3,
occurrences: 2,
where: [0, 2]
},
{
name: 'aa',
value: 1,
occurrences: 3,
where: [0, 1, 2]
}
],
[
{
name: 'aa',
value: 1,
occurrences: 3,
where: [0, 1, 2]
},
{
name: 'ab',
value: 2,
occurrences: 2,
where: [0, 1]
}
],
[
{
name: 'ac',
value: 3,
occurrences: 2,
where: [0, 2]
},
{
name: 'aa',
value: 1,
occurrences: 3,
where: [0, 1, 2]
}
]
]
属性的对象。
这是我脑海中的解决方案:
1.遍历具有最多对象的阵列
2.遍历每个对象
3.循环遍历其他数组并应用name
但这需要花费很多时间,因为我的每个阵列都至少有500个对象......
答案 0 :(得分:1)
这看起来像是微不足道的减少,直到我注意到嵌套数组)所以它更像是flatten + reduce,带有内存。
下面的代码正在做你需要的,只是道具名称很短(因为我在手机上输入):
let f = (ai, a,v,i,m) => {
if (!a[v.id]) {
a[v.id] = {id: v.id, v: v.name, count: 1, at: [ai]};
} else {
a[v.id].count += 1;
a[v.id].at.push(ai);
}
return a;
};
let r = [[{id: 'aa', value: 42}], [{id: 'ba', value: 11}, {id: 'aa', value: 42}]]
.reduce ((a, v, i) => v.reduce (f.bind (null, i),a), {});
console.log (r);
代码仍然只访问任何数组中的每个元素一次,因此复杂度为O(n),并且在阵列上运行它时应该没有问题,最多可达一百万个元素(例如1000个元素的1000个数组,或200个元素) x 5000)。
答案 1 :(得分:1)
您可以使用user instance=false
来获取对象中出现的次数和出现次数。
然后,您只需使用array#reduce
并添加arrays
和Object.assign()
属性,即可在where
中修改对象。
occurrences