Léo Coco
Léo Coco

Reputation: 4282

Filter object containing array of object

I would like to filter my data depending on a typed keyword.

https://jsfiddle.net/LeoCoco/e96L8akn/

let keyword = '-pre';

let data = {
  'Basic': [{
    name: 'a-basic'
  }, {
    name: 'b-basic'
  }, {
    name: 'c-basic'
  }],
  'Premium': [{
    name: 'a-pre'
  }, {
    name: 'b-pre'
  }, {
    name: 'c-pre'
  }],
  'Extra': [{
    name: 'a-ext'
  }, {
    name: 'b-ext'
  }, {
    name: 'c-ext'
  }],
};

Output

'Premium': [{name: 'a-pre'}, { name: 'b-pre'}, { name: 'c-pre'}]

My try

lodash.forEach(data, (card) => {
  card = card.filter(o => {
    return Object.keys(o).some(k => {
      return typeof o[k] === 'string' && o[k].toLowerCase().includes(keyword.toLowerCase());
    });
  });
})

But it does not work.The difficulty for me is that the filtering must happen on the nested object keys contained in each array.

Upvotes: 0

Views: 34

Answers (2)

Jonas Wilms
Jonas Wilms

Reputation: 138557

 var result={};
 Object.keys(data).forEach(key => {
   result[key] = data[key].filter(o => {
       return Object.keys(o).some(k =>typeof o[k] === 'string' && o[k].toLowerCase().includes(keyword.toLowerCase()));
  });
})

Upvotes: 1

Nenad Vracar
Nenad Vracar

Reputation: 122145

Because this is object you can use reduce() on Object.keys() instead and then inside use every() to check for keyword.

let keyword = '-pre';

let data = {"Basic":[{"name":"a-basic"},{"name":"b-basic"},{"name":"c-basic"}],"Premium":[{"name":"a-pre"},{"name":"b-pre"},{"name":"c-pre"}],"Extra":[{"name":"a-ext"},{"name":"b-ext"},{"name":"c-ext"}]}

var result = Object.keys(data).reduce(function(r, e) {
  var check = data[e].every(o => o.name.indexOf(keyword) != -1);
  if(check) r[e] = data[e]
  return r;
}, {})

console.log(result)

Upvotes: 1

Related Questions