Это очень простой вопрос. Я хочу отобразить и сформировать массив, заданный другой массив. тогда я хотел бы удалить дублированные значения.
вот что я сделал:
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 из неопределенного
Кто-нибудь знает обойти это?
статус по-прежнему не определен при вызове метода .filter
.
измените это на:
let status = listHotels.map(hotel => {
return hotel.status
}).filter((v, i, currentStatus) => (
currentStatus.indexOf(v) === i
));
Вы можете сделать это, используя 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);
статус еще не готов (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);
Поскольку вы используете 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 обратно в массив.
попробуй это:
let status = listHotels.map(hotel => {
return hotel.status
}).filter((v, i) => (
listHotels.indexOf(v) === i
));
status
будет назначен только после того, как будут выполнены все цепочечные методы, с результатом последнего цепочечного метода. Таким образом, вы пытаетесь получить доступ кstatus
внутри цепочечного метода до его назначения.