Find all matching elements with in an array of objects

ankur picture ankur · Sep 13, 2018 · Viewed 49.1k times · Source

I have an array of objects

I am searching within the array like this

let arr = [
    { name:"string 1", arrayWithvalue:"1,2", other: "that" },
    { name:"string 2", arrayWithvalue:"2", other: "that" },
    { name:"string 2", arrayWithvalue:"2,3", other: "that" },
    { name:"string 2", arrayWithvalue:"4,5", other: "that" },
    { name:"string 2", arrayWithvalue:"4", other: "that" },
];
var item  = arr.find(item => item.arrayWithvalue === '4'); 
console.log(item)

This should return an array with this two rows

{ name:"string 2", arrayWithvalue:"4,5", other: "that" },
{ name:"string 2", arrayWithvalue:"4", other: "that" }

It returns only one row which is the first match.

{ name:"string 2", arrayWithvalue:"4", other: "that" }

I do not want to use any external libraries for this. How can I return all the matches that match the criteria?

Answer

Orelsanpls picture Orelsanpls · Sep 13, 2018

Two thing, first, Array.find() return the first matching element, undefined if it finds nothing. Array.filter returns a new array containing all matching elements, [] if it matches nothing.

Second thing, if you want to match 4,5, you have to look into the string and do not make strict comparaison. To make that happens we use of indexOf which is returning the position of the matching string, or -1 if it matches nothing.


Example :

const arr = [
  {
    name: 'string 1',
    arrayWithvalue: '1,2',
    other: 'that',
  },
  {
    name: 'string 2',
    arrayWithvalue: '2',
    other: 'that',
  },
  {
    name: 'string 2',
    arrayWithvalue: '2,3',
    other: 'that',
  },
  {
    name: 'string 2',
    arrayWithvalue: '4,5',
    other: 'that',
  },
  {
    name: 'string 2',
    arrayWithvalue: '4',
    other: 'that',
  },
];

const items = arr.filter(item => item.arrayWithvalue.indexOf('4') !== -1);

console.log(items);