如何添加对象数组属性?

时间:2019-07-24 10:55:03

标签: javascript

读取属性name时,将属性user3的{​​{1}}和相同的属性放入等于user2值的对象属性name中。

我要打印出来:

a

我的代码:

[
  {
    name: 'b',
    user1: 'haha',
  },
  {
    name: 'a',
    user2: 'apple',
    user3: 'xiaomi'
  }
]

3 个答案:

答案 0 :(得分:1)

下面的代码将首先使相同的name字段已知,然后将它们合并。

var make_unique = function(xs, key) {
  // find same name fields
  let tmp_result =  xs.reduce(function(rv, x) {
    (rv[x[key]] = rv[x[key]] || []).push(x);
    return rv;
  }, {});
  // merge the same ones
  return Object.keys(tmp_result).map(item => {
     return tmp_result[item].reduce(function(rv, x) {
        return Object.assign(rv,x)
     }, {});
  })
};

要调用它:

make_unique(data,'name')

答案 1 :(得分:1)

您可以使用for循环查找相同的元素,并将其分配给另一个,然后使用splice方法从数组中删除找到的元素

var data = [{
    name: 'b',
    user1: 'haha',
  },
  {
    name: 'a',
    user2: 'apple',
  },
  {
    name: 'a',
    user3: 'xiaomi'
  }
]

for (var i=0 ; i<data.length;i++){
  for(var j=i+1;j<data.length;j++){
    if(data[i].name===data[j].name){
      Object.assign(data[i],data[j])
      data.splice(j,1)
    }
  }
}
console.log(data)

答案 2 :(得分:1)

reduce在数据上创建一个对象,其键设置为名称值,然后返回该对象的Object.values

var data = [{ name: 'b', user1: 'haha' }, { name: 'a', user2: 'apple' }, { name: 'a', user3: 'xiaomi' }];

function groupByName(arr) {
  return Object.values(data.reduce((acc, c) => {
    const { name, ...rest } = c;
    acc[name] = acc[name] || {};
    acc[name] = { ...acc[name], name, ...rest };
    return acc;
  }, {}));
}

const output = groupByName(data);
console.log(output);