从数组中的所有对象中移除键

14

我有如下的对象数组:

[{id:1, value:"100", name:"dog" ...},
{id:2, value:"200", name:"cat" ...},
{id:3, value:"300", name:"fish"....},
{id:4, value:"400", name:"mouse" ...},
{id:5, value:"500", name:"snake"...}]

我想过滤对象数组并只保留两个键,idvalue,以得到类似于以下内容:

[{id:1, value:"100"},
{id:2, value:"200"},
{id:3, value:"300"},
{id:4, value:"400"},
{id:5, value:"500"}]

目前,我正在使用for循环遍历对象数组,并使用新变量对空数组进行push()操作。是否有更简单的方法来完成这个任务?

我想使用 Lodash,例如_.pluck(PetList, 'id', 'value'); 但是Lodash仅提取值,而不是键。


1
这更像是映射而不是过滤... - Nina Scholz
2个回答

36

Array#filter 过滤数组中的单个元素,而不是从数组中的对象中筛选特定的键。您可以使用方法Array#map来转换对象并只保留所需的键。map被设计为将数组的每个元素转换为新的值,"映射"旧值到新值:

let newPetList = PetList.map(pet => ({ 
    id: pet.id,
    value: pet.value
}));
上面的代码遍历数组,将当前的对象存储在pet中。然后从箭头函数中返回一个新对象,该对象将是从pet中仅含有idvalue键的对应转换后的对象,最终生成了一个新的newPetList数组。而所有旧数组中的对象都被映射为一个新对象,不包含name键。
你也可以通过对象解构,过滤掉不需要的属性,如下所示:
let newPetList = petList.map(({ name, ...rest }) => rest);

这将name属性绑定到name并将其余部分保留在rest中,您可以返回它以删除name键。


5
你所要实现的是映射而非过滤。下面是一种解决方案。

var array = [{id:1, value:"100", name:"dog"},
{id:2, value:"200", name:"cat"},
{id:3, value:"300", name:"fish"},
{id:4, value:"400", name:"mouse"},
{id:5, value:"500", name:"snake"}];
var result = array.map(function(obj) {
    return {id: obj.id, value: obj.value};
});

console.log(result);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接