js: как отфильтровать повторяющийся элемент из двухмерного массива? - PullRequest
0 голосов
/ 04 января 2019

Есть ли способ решить следующую проблему: это исходные данные:

var m = [["a", "b"], ["c", "d", "e"], ["f", "g", "h"]]
var n = ["a","d","e", "h"]

Я хочу получить данные:

[["a"], ["d","e"], ["h"]]

Я пробовал:

function remove(arr, val) { 
    arr.forEach(v => {
        var index = v.indexOf(val); 
        if (index === -1) { 
            v.splice(index, 1);
        }
    });       
};
n.forEach(val=>{
    remove(m, val);
})
console.log(m)

Но я потерпел неудачу .... Есть ли решение для решения проблемы ??

Ответы [ 3 ]

0 голосов
/ 04 января 2019

Если вы в порядке с новым массивом, вы можете map и filter m в зависимости от того, включен ли элемент, который повторяется, в n:

var m = [["a", "b"], ["c", "d", "e"], ["f", "g", "h"]]
var n = ["a","d","e", "h"]

const filteredM = m.map(
  arr => arr.filter(
    item => n.includes(item)
  )
);
console.log(filteredM);
0 голосов
/ 04 января 2019

var m = [["a", "b"], ["c", "d", "e"], ["f", "g", "h"]];
var n = ["a","d","e", "h"];
const newarr = m.map(val => val.filter(element => n.includes(element)));
console.log(newarr);
0 голосов
/ 04 января 2019

Вы можете выполнять итерацию с конца массива и склеивать не общие элементы.

Необходимо начинать с конца, потому что склейка (в данном случае) изменяет длину массива и фактический индекс, если итерация от начала.

var m = [["a", "b"], ["c", "d", "e"], ["f", "g", "h"]],
    n = ["a", "d", "e", "h"];

m.forEach(a => {
    var i = a.length;
    while (i--) {
        if (!n.includes(a[i])) {
            a.splice(i, 1);
        }
    }
});

console.log(m); // [["a"], ["d", "e"], ["h"]]
.as-console-wrapper { max-height: 100% !important; top: 0; }
...