CodeG
CodeG

Reputation: 467

How do I filter an array of arrays using an array?

How do I filter an array of arrays (myNumbers) against an array (result) to get only the values that appear in result per each array in myNumbers?

Specifically, given:

var result = [02, 03, 04, 06, 07, 11, 12, 13];

var myNumbers = [
    [01, 03, 04, 05, 09, 10, 12, 14],
    [01, 03, 04, 05, 06, 08, 10, 12],
    [01, 02, 04, 05, 06, 08, 10, 12],
    [01, 03, 04, 05, 06, 09, 12, 13],
    [01, 02, 03, 05, 06, 08, 10, 11]
];

Output should be:

[
    [03, 04, 12],
    [03, 04, 06, 12],
    [02, 04, 06, 12],
    [03, 04, 06, 12, 13],
    [02, 03, 06, 11],
]

I'm only able to filter one array at a time:

// This only filters it for myNumbers[0]
var confereResult = result.filter(function (number) {
    if (myNumbers[0].indexOf(number) == -1)
            return number;
    console.log(number);
});

How do I go through the whole list instead?

Upvotes: 4

Views: 126

Answers (3)

Pedro leal
Pedro leal

Reputation: 174

Iterate throught the myNumbers array and apply a filter to each row.

var result = [02, 03, 04, 06, 07, 11, 12, 13];

var myNumbers = [
    [01, 03, 04, 05, 09, 10, 12, 14],
    [01, 03, 04, 05, 06, 08, 10, 12],
    [01, 02, 04, 05, 06, 08, 10, 12],
    [01, 03, 04, 05, 06, 09, 12, 13],
    [01, 02, 03, 05, 06, 08, 10, 11]
];
myNumbers.forEach((arr, i) => {
  myNumbers[i] = arr.filter((val) => {
    return result.indexOf(val) != -1;
  });
});
console.log(myNumbers);

Upvotes: 4

user11062679
user11062679

Reputation:

You can loop on myNumbers and push result into an array, like

var result = [02, 03, 04, 06, 07, 11, 12, 13];

var myNumbers = [
    [01, 03, 04, 05, 09, 10, 12, 14],
    [01, 03, 04, 05, 06, 08, 10, 12],
    [01, 02, 04, 05, 06, 08, 10, 12],
    [01, 03, 04, 05, 06, 09, 12, 13],
    [01, 02, 03, 05, 06, 08, 10, 11]
];
var confereResult = []
myNumbers.forEach(function (val) {
  confereResult.push(result.filter(function (number) {
      if (val.indexOf(number) == -1)
              return number;
  }));
})

console.log(confereResult)

Upvotes: 0

Nina Scholz
Nina Scholz

Reputation: 386550

You could map the result of the filtering.

var filter = [02, 03, 04, 06, 07, 11, 12, 13],
    array = [[01, 03, 04, 05, 09, 10, 12, 14], [01, 03, 04, 05, 06, 08, 10, 12], [01, 02, 04, 05, 06, 08, 10, 12], [01, 03, 04, 05, 06, 09, 12, 13], [01, 02, 03, 05, 06, 08, 10, 11]],
    result = array.map(a => filter.filter(f => a.includes(f)));

console.log(result.map(a => a.join(' ')));
.as-console-wrapper { max-height: 100% !important; top: 0; }

Upvotes: 5

Related Questions