首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将对象数组的所有值与JavaScript / JQuery中对象属性的数组索引相加

将对象数组的所有值与JavaScript / JQuery中对象属性的数组索引相加
EN

Stack Overflow用户
提问于 2021-03-08 20:14:58
回答 2查看 120关注 0票数 1

我有一个这样的对象数组

代码语言:javascript
运行
复制
[
   {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

我可以使用多个循环做到这一点,如下所示:

代码语言:javascript
运行
复制
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;
  });

});

但这似乎是相当冗长和低效的。有没有更优雅/更有效的方法来实现这一点?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-03-08 21:27:39

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

代码语言:javascript
运行
复制
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)

票数 0
EN

Stack Overflow用户

发布于 2021-03-08 21:03:54

您可以先做一个过滤器,然后再做一个映射(以便只挑选出Vals),然后在过滤/映射的数组上使用reduce。

代码语言:javascript
运行
复制
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
})
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66529698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档