javascript从数组中的所有对象中提取某些属性

IT技术 javascript arrays ecmascript-6
2021-01-28 03:41:00

我有一组具有相同属性的对象。每个对象都有大约一百个属性。我只想将其中的一小部分保留在新数组中:

var dummyArray = [{ "att1": "something", "att2": "something", ..., "att100": "something"}, { "att1": "something", "att2": "something", ..., "att100": "something"}, ...];

如何过滤/映射/减少...并提取有趣的键?

const newDummArray = dummyArray.map(function(item) { 
    delete item.att1; 
    delete item.att3; 
    delete item.att15;
    // ... (long list)
    return item; 
});

我怎样才能只保留att20, att30, att70,att80为每个对象并删除其余的?

5个回答

使用对象解构来获取属性,并使用速记属性名称生成一个新对象

const dummyArray = [{ "att20": "att20", "att30": "att30", "att70": "att70", "att80": "att80"}, { "att20": "att20", "att30": "att30", "att70": "att70", "att80": "att80"}];

const result = dummyArray.map(({ att20, att30, att70, att80 }) => ({
  att20, 
  att30, 
  att70, 
  att80
}));

console.log(result);

map 创建一个新数组,所以不需要删除任何东西,而是创建一个有趣的键数组并返回它

var dummyArray = [{
  "att1": "something",
  "att2": "something",
  "att20": "something",
  "att100": "something"
}, {
  "att1": "something",
  "att2": "something",
  "att20": "something",

  "att100": "something"
}];

let x = dummyArray.map((item) => {
  return {
    attr20: item.att20
  }

})

console.log(x)

将您想要保留的props存储在一个数组中,然后为每个对象将想要的props转移到一个新对象。

var dummyArray = [{ "att1": "something", "att2": "something", "att100": "something"}, { "att1": "something", "att2": "something", "att100": "something"}];

var propsToKeep = ["att1", "att100"];

var result = dummyArray.map(item => {
  const obj = {};
  for (const prop of propsToKeep) {
    obj[prop] = item[prop];
  }
  return obj;
})

console.log(result)

这对于通用函数来说很好,但当键列表是先验已知时效率低下。
2021-03-19 03:41:00
@Alnitak 是的,但即在 ori-dori 和 brk 解决方案中存在代码重复(键名重复)。我认为代码重复(以及任何过早的优化混乱)比慢一点但更灵活的代码更糟糕
2021-03-24 03:41:00

这里有一个函数,它接受一个对象,并只提取你想要的属性。你通过一个数组作为第二个参数传递。

优点:更直接、更清洁。特别是当您只需要从一个对象中提取时。

如果你有一个对象列表。遍历列表并在每次迭代中提取。

function objectExtract(obj, properties) {
    return properties.reduce((result, prop) => {
        if (obj.hasOwnProperty(prop)) {
            result[prop] = obj[prop];
        }
        return result;
    }, {});
}

在此处阅读有关reduce 的信息https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

利用:

(redux 的真实例子)

store.dispatch(
            setRooms({ 
                ...roomsState,
                list: rooms.reduce((list, room) => {
                    list[room.id] = objectExtract(room, ['name', 'description', 'createdAt', 'updatedAt']);
                    return list;
                }, {})
            })
        )

(以问题为例)

var dataSourceArray = [{
  "att1": "something",
  "att2": "something",
  "att20": "something",
  "att100": "something"
}, {
  "att1": "something",
  "att2": "something",
  "att20": "something",

  "att100": "something"
}];

let x = dataSourceArray.map((item) => {
  return objectExtrac(item, ['att100', 'att2']);
});
不知何故...,其他答案中的传播运算符给我带来了麻烦。真正的功能objectExtract非常适合我。
2021-04-06 03:41:00

我找到了最简单的方法来做这个 JSON.stringify()

JSON.stringify() 方法将 JavaScript 对象或值转换为 JSON 字符串,如果指定了替换器函数,则可以选择替换值,或者如果指定了替换器数组,则可以选择仅包含指定的属性。

    const odata = [
      { "id": "0001", "type": "donut", "name": "Cake", "ppu": 0.55 },
      { "id": "0002", "type": "ansd", "name": "EARK", "ppu": 0.67 }
    ];
    const outdata=JSON.stringify(odata,['id','type']);
    console.log(outdata);