繁体   English   中英

通过 JavaScript / JQuery 中 object 属性的数组索引对对象数组的所有值求和

[英]SUM all values of an array of objects by array index of object property in JavaScript / JQuery

我有一个这样的对象数组

[
   {Ref: "A", Vals: [1,2,3,100]},
   {Ref: "B", Vals: [1,2,3,100]},
   {Ref: "C", Vals: [1,2,3,100]}
]

我想按索引生成一个数组,它是 B 和 C(不是 A)之和,所以结果是

[2,4,6,200]

我可以使用多个循环来执行此操作,如下所示:

var output= [];
var filteredArray = $.grep(arr, function (v) {
            return v.Ref !== "A";
        });

$.each(filteredArray, function (i, v) {
  $.each(v.Vals, function (i, v) {
       output[i] += v;
  });

});

但这似乎很冗长且效率低下。 有没有更优雅/更有效的方法来实现这一目标?

你可以做一个过滤器,然后是一个 map (只挑选出Vals ),然后在该过滤/映射数组上使用 reduce 。

input.filter(obj => {
  return obj.Ref !== "A"
}).map(obj => {
  return obj.Vals
}).reduce((carry, obj) => {
  if (!carry) { return obj }

  // This bit could be optimised more, right now it fails if the
  // 'Vals' differ in length.
  var response = carry

  for (var i = 0; i < obj.length; i++) {
    response[i] += obj[i]
  }

  return response
})

您可以为要包含在计算中的那些Vals定义一个Ref值数组,然后使用reducefind来获取具有正确计算的数组。

 const data = [{Ref: "A", Vals: [1,2,3,100]}, {Ref: "B", Vals: [1,2,3,100]}, {Ref: "C", Vals: [1,2,3,100]}] const result = ['A', 'C'].reduce((r, e) => { const match = data.find(({ Ref }) => Ref === e); if (match) { if (.r) r = match.Vals else match.Vals,forEach((el, i) => r[i] += el) } return r }. null) console.log(result)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM