检查对象数组是否具有相同的键和总和值

时间:2020-06-11 11:07:56

标签: javascript

我有一个包含这些对象的数组。我想要的是相同键的总和值。例如,

let data = [
  {
    name: "fieldA",
    value: 20,
  },
  {
    name: "building",
    value: 20,
  },
  {
    name: "fieldA",
    value: 20,
  },
  {
    name: "building",
    value: 20,
  },
];

结果应该是:

[
  {
    name: "fieldA",
    value: 40,
  },
  {
    name: "building",
    value: 40,
  }
];

该怎么做?可以使用map函数吗?

3 个答案:

答案 0 :(得分:2)

您可以使用reduce()来实现:

var data = [ { name: "fieldA", value: 20, }, { name: "building", value: 20, }, { name: "fieldA", value: 20, }, { name: "building", value: 20, }];

var result = Object.values(data.reduce((acc,{name, value})=>{
    acc[name] = acc[name] || {name, value:0};
    acc[name].value+=value;
    return acc;
},{}));

console.log(result);

答案 1 :(得分:1)

您需要reduce()

const data = [
    {
        name: 'fieldA',
        value: 20,
    },
    {
        name: 'building',
        value: 20,
    },
    {
        name: 'fieldA',
        value: 20,
    },
    {
        name: 'building',
        value: 20,
    },
];

const result = data.reduce((acc, val) => {
    const findName = acc.find(_ => _.name === val.name);

    if (findName) {
        findName.value += val.value;
    } else {
        acc.push(val);
    }

    return acc;
}, []);

console.log(result);

答案 2 :(得分:0)

假设是故意的,那么所有对象似乎都具有相同的“值”,这是我的解决方案……不是超级优雅,但能做到

let data = [{
    name: "fieldA",
    value: 20,
  },
  {
    name: "building",
    value: 20,
  },
  {
    name: "fieldA",
    value: 20,
  },
  {
    name: "building",
    value: 20,
  },
];

function matchValue(param, val) {
  let matches = [];

  for (let i = 0; i < param.length; i++) {
    console.log(param[i]);
    if (param[i].value === val) {
      matches.push(param[i]);
    }
  }
  return matches;
}

console.log(matchValue(data, 20));