Не понятна работа функции фильтрации в TypeScript

157
01 апреля 2018, 21:57

Читаю книгу Pro Angular. Не понимаю в чем смысл записи в функции .filter(...)

get categories(): string[] {
return this.model.getProducts()
.map(p => p.category)
.filter((category, index, array) => array.indexOf(category) == index);}

Знаю, что это функция фильтрации в массиве, но зачем проверять заведомо известный индекс элемента?

Answer 1

В данном случае это пример получения уникальных значений в массиве:

.indexOf проверяет элементы с начала массива, и если в массиве будет несколько одинаковых элементов - то в этом случае индекс совпадет только для первого вхождения:

var a = [1, 1, 2, 2, 3, 3, 4, 4]; 
 
console.log(a.filter((cur, i, arr) => arr.indexOf(cur) === i));

Однако, это может не сработать с объектами, так как в этом случае два объекта будут считаться разными, не смотря на то, что имеют одинаковые значения в полях

var a = [{ 
  a: 1 
}, { 
  a: 1 
}, { 
  a: 1 
}]; 
console.log(a.filter((cur, i, arr) => arr.indexOf(cur) === i))

В этом случае лучше использовать метод findIndex

var a = [{ 
  a: 1 
}, { 
  a: 1 
}, { 
  a: 1 
}]; 
console.log(a.filter((cur, i, arr) => arr.findIndex(c => c.a === cur.a) === i))

READ ALSO
Изменение значения value

Изменение значения value

Можно ли сделать чтобы значение value="41" менялось?)

177
Изменить значения input range js

Изменить значения input range js

Здравствуйте, у меня есть input type='range'С помощью js я задаю ему значения max, min, value

169
Разворот односвязного списка - JavaScript

Разворот односвязного списка - JavaScript

Здравствуйте, уважаемые форумчанеЗадачка состоит в том, чтобы проверить "правильность" скобок в строке str

406