我有这个对象数组:
arr=[
{a: 1,b: 0,x: 100},
{a: 0,b: 0,x: 100},
{a: 1,b: 1,x: 100},
{a: 1,b: 0,x: 200},
{a: 1,b: 1,x: 200},
....
]
现在,我需要做的是比较“x”值,如果它们重合,则转移将另一个数组中的“a”和“b”值相加。例如:
ARR2 = [{A = 2,B = 1,X = 100},{A = 2,B = 1,X = 200} ....]
要做的第二件事是计算用相同的“x”值连接的对象数。例如,在第一个“arr2”对象中连接3个“arr”对象,在第二个“arr2”对象中连接2个“arr”对象,依此类推。
答案 0 :(得分:1)
这个问题似乎没有意义。首先,"重合"没有我所知道的技术定义。你能更清楚你的意思吗?
其次不清楚你的预期结果是什么。如果我是你,我会做的就是从一些简单的示例输入开始,然后想出相应的输出,然后使用单元测试工具开发代码来做你想要的。< / p>
例如,我必须猜测你想要什么,但它可能看起来像这样(在javascript中)使用库chai和mocha:
import { expect } from 'chai'
function doWork(input) {
// code goes here
}
const tests = [
{
name: 'Same x values coalesce',
data: [
{a=1,b=0,x=100},
{a=0,b=0,x=100}
],
expected: {
100: [1, 0]
}
}
]
describe('work', () => {
tests.forEach(test => {
it(t.name, () => {
const result = doWork(test.data)
expect(result).to.deep.equal(test.expected)
})
})
})
这项技巧可以帮助您自己找到答案。
尝试使用您的术语更准确一些,并举例说明您希望获得的输出。
答案 1 :(得分:0)
数组reduce和map是有趣的方法。 Object.keys()将为您提供一组键,并允许您执行更多的数组缩减和映射。有趣的时光。
let arr = [
{ a: 1, b: 0, x: 100 },
{ a: 0, b: 0, x: 100 },
{ a: 1, b: 1, x: 100 },
{ a: 1, b: 0, x: 200 },
{ a: 1, b: 1, x: 200 }
];
let lists = arr.reduce((prev, curr) => {
let list = prev[curr.x] || [];
list.push(curr);
prev[curr.x] = list;
return prev;
}, {});
console.log(lists);
let flat = Object.keys(lists).reduce((prev, curr) => {
prev.push(
lists[curr].reduce(
(prev, curr) => {
prev.a += curr.a;
prev.b += curr.b;
prev.x = curr.x;
return prev;
},
{ a: 0, b: 0 }
)
);
return prev;
}, []);
console.log(flat);
Object.keys(lists).forEach(el => console.log(el + ': ' + lists[el].length));
&#13;