开发者问题收集

如何添加对象数组属性?

2019-07-24
53

读取属性 name 时,将属性 user2user3 和相同属性放入一个等于 a 值的对象属性 name 中。

我要打印出来:

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

我的代码:

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

var arr = []

for (var i = 0; i < data.length; i++) {
  console.log(data[i].name)
}
3个回答

以下代码首先将使相同的 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')
Alireza HI
2019-07-24

您可以使用 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)
adel
2019-07-24

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);
Andy
2019-07-24