Javascript - 比较对象数组和总和重合值

时间:2017-07-25 21:28:48

标签: javascript arrays

我有这个对象数组:

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”对象,依此类推。

2 个答案:

答案 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()将为您提供一组键,并允许您执行更多的数组缩减和映射。有趣的时光。

&#13;
&#13;
    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;
&#13;
&#13;