user9510048
user9510048

Reputation:

Filter JSON with desired keys

I have an array of objects sample for example :

const data = [
    {
        Name: 'test_1',
        Value: '175',
        Description: 'desc_1'
    },
    {
        Name: 'test_2',
        Value: '175',
        Description: 'desc_2' 
    }
]

And an env file where I mark the data I want :

Name=true
Value=true
Description=false

How do I filter out the data file to only return the values of the keys Name and Value?

Desired output :

[
    {
        Name: 'test_1',
        Value: '175'
    },
    {
        Name: 'test_2',
        Value: '175',
    }
]

Upvotes: 3

Views: 113

Answers (4)

axtck
axtck

Reputation: 3965

Another solution would be filtering the objects entries when mapping and creating a new object from those entries.

const data = [{
    Name: 'test_1',
    Value: '175',
    Description: 'desc_1'
  },
  {
    Name: 'test_2',
    Value: '175',
    Description: 'desc_2'
  }
]

const status = {
  Name: true,
  Value: true,
  Description: false
}

// props you want to keep
const keep = Object.keys(status).filter((k) => status[k]);

const result = data.map((d) => {
  // create object from entries based on what you want to keep
  return Object.fromEntries(Object.entries(d).filter(([k]) => {
    return keep.includes(k)
  }));
})

console.log(result);

Upvotes: 0

NeNaD
NeNaD

Reputation: 20404

You can do it like this:

const data = [
  { Name: 'test_1', Value: '175', Description: 'desc_1' },
  { Name: 'test_2', Value: '175', Description: 'desc_2' }
]

let results = data.map((item) => {
  new_item = {};
  if (process.env.Name) new_item.Name = item.Name;
  if (process.env.Value) new_item.Value= item.Value;
  if (process.env.Description) new_item.Description= item.Description;
  return new_item;
}) 

Upvotes: 2

Nithish
Nithish

Reputation: 6049

There are different ways in order to achieve the required output, here I'm making use of Array.map and Array.reduce methods.

const data = [{ Name: 'test_1', Value: '175', Description: 'desc_1', }, {Name: 'test_2', Value: '176', Description: 'desc_2', }];

//In order to access from the env file
/*
const fields = {
  Name: process.env.Name,
  Value: process.env.Value,
  Description: process.env.Description
}
*/

//For the snippet purpose i'm using this hardcoded values
const fields = {
  Name: true,
  Value: true,
  Description: false
}

//Convert the object to an array of keys whose values are needed from the original data
const getConfigData = fields => Object.keys(fields).filter(key => fields[key])
let config = getConfigData(fields);

const getSelectedKeyValues = (data, config) => {
  return data.map(obj => config.reduce((acc, c) => (acc[c] = obj[c], acc), {}));
}

console.log("Name & Value:", getSelectedKeyValues(data, config));
.as-console-wrapper {
  max-height: 100% !important;
}

Upvotes: 3

Stiegi
Stiegi

Reputation: 1805

Since your example is a JS array and no JSON string, you can use map:

const result = data.map(d => { return {Name: d.name, Value: d.Value }});

Upvotes: 0

Related Questions