基于另一个包含键的数组在JavaScript中筛选对象数组

3

我有一个对象数组如下所示:

people = [
{id: "1", name: "abc", gender: "m", age:"15" },
{id: "2", name: "a", gender: "m", age:"25" },
{id: "3", name: "efg", gender: "f", age:"5" },
{id: "4", name: "hjk", gender: "m", age:"35" },
{id: "5", name: "ikly", gender: "m", age:"41" },
{id: "6", name: "ert", gender: "f", age:" 30" },
{id: "7", name: "qwe", gender: "f", age:" 31" },
{id: "8", name: "bdd", gender: "m", age:" 78" },
 ]

我有另外一个数组,里面包含我想要从对象中获取的值:

filter = ['name','age']

我想要筛选人员数组以返回仅包含筛选条件内值的对象数组。因此,输出应该如下所示:
    people = [
{ name: "abc",  age:"15" },
{ name: "a", age:"25" },
{ name: "efg",  age:"5" },
{ name: "hjk",  age:"35" },
{ name: "ikly",  age:"41" },
{ name: "ert",  age:" 30" },
{ name: "qwe",  age:" 31" },
{ name: "bdd", age:" 78" },
 ]

这与此处的问题类似:基于另一个数组在JavaScript中过滤对象数组


使用 map 方法。 - Devang
4个回答

2
您可以映射对象并使用键作为新条目。

var people = [{ id: "1", name: "abc", gender: "m", age: "15" }, { id: "2", name: "a", gender: "m", age: "25" }, { id: "3", name: "efg", gender: "f", age: "5" }, { id: "4", name: "hjk", gender: "m", age: "35" }, { id: "5", name: "ikly", gender: "m", age: "41" }, { id: "6", name: "ert", gender: "f", age: " 30" }, { id: "7", name: "qwe", gender: "f", age: " 31" }, { id: "8", name: "bdd", gender: "m", age: " 78" }],
    keys = ['name', 'age'],
    result = people.map(o => Object.fromEntries(keys.map(k => [k, o[k]])));

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


0
一种方法是使用mapreduce
const result = people.map(item => filter.reduce((acc, cur) => {
  acc[cur] = item[cur];
  return acc;
}, {}))

0
我们可以使用 Object.entries 创建 entries,然后使用 filter 方法过滤对象中的 filter 数组,最后只需使用 map 方法来映射所需的元素,这些元素可以通过 Object.fromEntries 创建:
people = people.map(s => ({ ...Object.fromEntries(Object.entries(s)
    .filter(([k, v]) => filter.some(f => f == k)))}));

let people = [
    {id: "1", name: "abc", gender: "m", age:"15" },
    {id: "2", name: "a", gender: "m", age:"25" },
    {id: "3", name: "efg", gender: "f", age:"5" },
    {id: "4", name: "hjk", gender: "m", age:"35" },
    {id: "5", name: "ikly", gender: "m", age:"41" },
    {id: "6", name: "ert", gender: "f", age:" 30" },
    {id: "7", name: "qwe", gender: "f", age:" 31" },
    {id: "8", name: "bdd", gender: "m", age:" 78" },
];

let filter = ['name','age'];
people = people.map(s => ({ ...Object.fromEntries(Object.entries(s)
    .filter(([k, v]) => filter.some(f => f ==k)))}));

console.log(people);


-1

Map方法可以解决你的问题。

const people = [
{id: "1", name: "abc", gender: "m", age:"15" },
{id: "2", name: "a", gender: "m", age:"25" },
{id: "3", name: "efg", gender: "f", age:"5" },
{id: "4", name: "hjk", gender: "m", age:"35" },
{id: "5", name: "ikly", gender: "m", age:"41" },
{id: "6", name: "ert", gender: "f", age:" 30" },
{id: "7", name: "qwe", gender: "f", age:" 31" },
{id: "8", name: "bdd", gender: "m", age:" 78" },
 ];
 
 const result = people.map(person => {
    return {
        name: person.name,
        age: person.age
    }
})

console.log(result);


你还没有使用过筛选数组。 - yunzen
为什么要使用过滤数组? - Devang
1
因为在原帖中是这样写的。 - yunzen
Nina将filter数组的名称更改为keys。她使用了OP提问者想要的动态过滤。而你使用了硬编码映射,这就是为什么你的答案不正确的原因。 - yunzen

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