Карта и фильтр сопоставленного массива в Javascript

1

Это очень простой вопрос. Я хочу отобразить и сформировать массив, заданный другой массив. тогда я хотел бы удалить дублированные значения.

вот что я сделал:

let status = listHotels.map(hotel => {
  return hotel.status
})

const x = status.filter((v, i) => (
  status.indexOf(v) === i
));

Оно работает. Но я хотел бы решение, которое не включает в себя написание двух блоков кода. Я попробовал это:

let status = listHotels.map(hotel => {
  return hotel.status
}).filter((v, i) => (
  status.indexOf(v) === i
));

Но это не сработало. Это говорит

Не удается прочитать свойство indexOf из неопределенного

Кто-нибудь знает обойти это?

  • 0
    статус недоступен внутри цепочечного метода
  • 0
    status будет назначен только после того, как будут выполнены все цепочечные методы, с результатом последнего цепочечного метода. Таким образом, вы пытаетесь получить доступ к status внутри цепочечного метода до его назначения.
Показать ещё 3 комментария
Теги:

5 ответов

4

статус по-прежнему не определен при вызове метода .filter.

измените это на:

let status = listHotels.map(hotel => {
  return hotel.status
}).filter((v, i, currentStatus) => (
  currentStatus.indexOf(v) === i
));
  • 0
    Спасибо! это решило это.
  • 0
    нет проблем, пожалуйста;)
2

Вы можете сделать это, используя findIndex, передав функцию для сравнения статусов и поменяв местами фильтр/карту:

const listHotels = [{status: 'bad'}, {status: 'good'}, {status: 'bad'}];

let status = listHotels.filter((v, i) =>
  listHotels.findIndex(v2 => v.status === v2.status) === i
).map(hotel => hotel.status);

console.log(status);
1

статус еще не готов (undefined) для доступа внутри filter(). Но в первом решении map() возвращает и сохраняет результат в статусе, который делает переменную доступной в последующих операторах.

Вы можете передать сам массив в качестве третьего параметра для использования в filter(). Вам также не нужно использовать ненужный оператор возврата здесь:

var listHotels = [{status:'a'}, {status:'b'}, {status:'a'}]

let status = listHotels.map(hotel => hotel.status)
                       .filter((v, i, arr) => arr.indexOf(v) === i);
console.log(status);
0

Поскольку вы используете let и const я предполагаю, что вы также можете использовать ES6 Set:

const data = [{
  status: 'one',
  id: 1
}, {
  status: 'one',
  id: 2
}, {
  status: 'two',
  id: 3
}, {
  status: 'two',
  id: 4
}]

const uniqueStatus = [...new Set(data.map(({
  status
}) => status))]

console.log(uniqueStatus)

Передача сопоставленного массива в Set обеспечит уникальность. Вы можете деструктурировать Set обратно в массив.

-1

попробуй это:

let status = listHotels.map(hotel => {
  return hotel.status
}).filter((v, i) => (
  listHotels.indexOf(v) === i
));

Ещё вопросы

Сообщество Overcoder
Наверх
Меню