首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在数组中添加对象的属性,通过loadash获取单个对象

在数组中添加对象的属性,通过loadash获取单个对象
EN

Stack Overflow用户
提问于 2017-05-09 19:21:09
回答 5查看 61关注 0票数 0

我在我的项目中使用loadash,我在数组中有这样的对象

代码语言:javascript
复制
[{
    "rating": {
        "time_to_table": 5,
        "value_for_money": 5,
        "innovation": 5,
        "plating_decoration": 5,
        "taste": 5
    }
}, {
    "rating": {
        "time_to_table": 0,
        "value_for_money": 3,
        "innovation": 2,
        "plating_decoration": 2,
        "taste": 4
    }
}]

现在,我希望通过添加每个属性来实现如下输出,并希望单个对象如下所示

代码语言:javascript
复制
"rating": {
    "time_to_table": 5,
    "value_for_money": 8,
    "innovation": 7,
    "plating_decoration": 7,
    "taste": 9
}

我试过了

代码语言:javascript
复制
        var obj = {
            "time_to_table": 0,
            "value_for_money": 0,
            "innovation": 0,
            "plating_decoration": 0,
            "taste": 0,
            "total" : 5 * data.length
        }

        _.forEach(data,function(d){          
            obj.time_to_table += d.rating.time_to_table;
            obj.value_for_money += d.rating.value_for_money;
            obj.innovation += d.rating.innovation;
            obj.plating_decoration += d.rating.plating_decoration;
            obj.taste += d.rating.taste;
        });
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2017-05-09 19:36:32

对于Lodash,您可以使用reduce()mergeWith()来实现这一点,它们将自定义函数作为参数。

代码语言:javascript
复制
var data = [{"rating":{"time_to_table":5,"value_for_money":5,"innovation":5,"plating_decoration":5,"taste":5}},{"rating":{"time_to_table":0,"value_for_money":3,"innovation":2,"plating_decoration":2,"taste":4}}]

var result = _.reduce(data, function(r, e, i) {
  if(i != 0) _.mergeWith(r.rating, e.rating, (a, b) => a + b)
  return r;
}, data[0])

console.log(result)
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.min.js"></script>

票数 1
EN

Stack Overflow用户

发布于 2017-05-09 19:29:39

您可以使用Array#reduce()Object.keys()来完成此操作

代码语言:javascript
复制
const data = [{rating:{time_to_table:5,value_for_money:5,innovation:5,plating_decoration:5,taste:5}},{rating:{time_to_table:0,value_for_money:3,innovation:2,plating_decoration:2,taste:4}}];

let finalObject = data.reduce((o, c) => {
  Object.keys(c.rating).forEach(k => {
    o.rating[k] = o.rating[k] || 0;
    o.rating[k] += c.rating[k];
  });
  return o;
}, { rating: {} })

console.log(finalObject);
代码语言:javascript
复制
.as-console-wrapper { max-height: 100% !important; top: 0; }

票数 0
EN

Stack Overflow用户

发布于 2017-05-09 19:31:57

您可以使用reduce,并在对象中拥有任意多的属性。

下面的函数不需要知道正在传递的对象类型的任何信息,因为没有硬编码的属性

代码语言:javascript
复制
const arr = [{
    "rating": {
        "time_to_table": 5,
        "value_for_money": 5,
        "innovation": 5,
        "plating_decoration": 5,
        "taste": 5
    }, 
    a: {b: 1, c: 2}
}, {
    "rating": {
        "time_to_table": 0,
        "value_for_money": 3,
        "innovation": 2,
        "plating_decoration": 2,
        "taste": 4
    },
    a: {b: 3, c: 0}
}];

const result = arr.reduce(fn, {})

function fn (acc, val) {
  for (let x in val) {
    acc[x] = acc[x] || {};
    for (let y in val[x]) {
      acc[x][y] = acc[x][y] || 0;
      acc[x][y] += val[x][y];
    }
  }
  
  return acc;
}

console.log(result)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43868447

复制
相关文章

相似问题

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