3

I have an array of Objects as shown below:

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" },
 ]

And I have another array containing the values I want from the object:

filter = ['name','age']

I want to filter the array of people to return an array of objects that contains only values in that filter. So the Output should look like this:

    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" },
 ]

This is similar to the question here: filtering an array of objects based on another array in javascript

1
  • Use map method. Commented May 19, 2020 at 8:20

4 Answers 4

2

You could map the object and take the keys for new entries.

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; }

Sign up to request clarification or add additional context in comments.

Comments

0

One way is to use map with reduce:

const result = people.map(item => filter.reduce((acc, cur) => {
  acc[cur] = item[cur];
  return acc;
}, {}))

Comments

0

We can create entries by Object.entries, then filter our object by filter array using filter method and then just map desired elements which can be created by 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);

Comments

-1

Map method can resolve your issue.

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);

4 Comments

You haven't used the filter array
Why to use filter array?
Because it says so in the OP
Nina changed the name of the filter array to keys. She did use the dynamic filtering the OP asker wants. You did a hard coded mapping. That's why your answer is not correct

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.