将新属性添加到对象数组

时间:2018-01-15 11:08:29

标签: javascript

我有一个实体列表,其中每个实体如下:

var entity = {
  position: 'X',
  varA: [{ id: 1, name: 'A1' }, { id: 2, name: 'A2' }],
  varB: [{ id: 1, name: 'B1' }, { id: 2, name: 'B2' }],
  varC: [{ id: 1, name: 'C1' }, { id: 2, name: 'C2' }],
}

对于每个实体,我需要添加一个属性'名称'那就是:

entity.names = [varA[0].name, varB[0].name, varC[0].name];

问题是varA,varB或varC在某些情况下可能是未定义的或没有值。所以我试过了:

vm.entities.map(function(entity) { 

  entity.names = [entity.varA[0], entity.varB[0], entity.varC[0]].filter(e => e).map(({name:n}) => n);

  return entity; 

});

预期输出为:

entity.names = [ 'A1', 'B1', 'C1' ]

但是,由于此代码行,我无法缩小我的javascript:

entity.names = [entity.varA[0], entity.varB[0], entity.varC[0]].filter(e => e).map(({name:n}) => n);

我做错了什么,有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

您可以迭代对象的所有键,只使用数组来收集新属性的名称。

要从数组中只获取一个名称,可以使用Array#some并在找到数组名称时退出。

var entity = { position: 'X', varA: [{ id: 1, name: 'A1' }, { id: 2, name: 'A2' }], varB: [{ id: 1, name: 'B1' }, { id: 2, name: 'B2' }], varC: [{ id: 1, name: 'C1' }, { id: 2, name: 'C2' }] };

entity.names = Object.keys(entity).reduce(function (r, k) {
    if (Array.isArray(entity[k])) {
        entity[k].some(function (o) {
            if (o && typeof o === 'object' && o.name) {
                r.push(o.name);
                return true;
            }
        });
    }
    return r;
}, []);

console.log(entity);
.as-console-wrapper { max-height: 100% !important; top: 0; }