Как использовать FILTER для многомерного массива для получения уникальных значений? - PullRequest
2 голосов
/ 14 апреля 2020

Я смотрел на другие вопросы, подобные этому, но не видел ответа, который соответствовал бы тому, что я пытаюсь сделать.

У меня есть многомерный массив:

var arr = [
["apple","ghana",15],
["apple","brazil",16],
["orange","nigeria",10],
["banana","ghana",6]
]

Я хочу отфильтровать массив, только взглянув на первый столбец, который содержит название плода, и вернуть массив уникальных значений. Так это будет выглядеть так:

var uniqueArr = [
["apple","ghana",15],
["orange","nigeria",10],
["banana","ghana",6]
]

Я хотел бы предоставить функцию, которая будет делать это. Я пытался:

    function isUnique (rows,index,self) {
      return self.indexOf(rows) === index
    }

Но это не сработало. Любая помощь будет оценена!

Ответы [ 4 ]

4 голосов
/ 14 апреля 2020

Используйте reduce для получения результата.

var arr = [["apple","ghana",15],["apple","brazil",16],["orange","nigeria",10],["banana","bangladesh",20],["banana","ghana",6]];

const res = arr.reduce((a, c) => {
	if (!a.find(v => v[0] === c[0])) {
		a.push(c);
	}
	return a;
}, []);

console.log(res);
.as-console-wrapper {
  min-height: 100% !important;
  top: 0;
}
2 голосов
/ 14 апреля 2020

Вы можете взять Set и отфильтровать массив с помощью проверки, существует ли значение.

  • Если существует, отклоните элемент.

  • Если нет, добавьте значение в набор и возьмите элемент.

var array = [["apple", "ghana", 15], ["apple", "brazil", 16], ["orange", "nigeria", 10], ["banana", "ghana", 6]],
    seen = new Set,
    result = array.filter(([value]) => !seen.has(value) && seen.add(value));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 14 апреля 2020

Попробуйте это

const filtered = arr.filter((row, index) => arr.findIndex(row2 => row2[0] === row[0]) >= index);
0 голосов
/ 14 апреля 2020

Сократить массив до объекта, используя столбец 1 (индекс 0) в качестве ключа, а затем преобразовать обратно в массив с помощью Object.values():

const arr = [["apple","ghana",15],["apple","brazil",16],["orange","nigeria",10],["banana","ghana",6]]

const result = Object.values(
  arr.reduce((r, a) => {
    if(!r[a[0]]) r[a[0]] = a // add the item to the object, if the property doesn't exist yet
  
    return r
  }, {})
)

console.log(result)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...