#javascript #arrays #filtering #string-comparison
#javascript #массивы #фильтрация #сравнение строк
Вопрос:
У меня есть массив, который содержит следующие объекты.
myArray = [
{ item: { id: 111557 } },
{ item2: { id: 500600 } }]
и у меня есть переменная
targetItemID = '111557'
Обратите внимание, что одна строка, а те, что в массиве, являются числами. Я пытаюсь получить объект с правильным идентификатором элемента.
Вот что я пробовал,
myArray = [
{ item: { id: 111557 } },
{ item2: { id: 500600 } }]
targetItemID = '111557'
var newArray = myArray.filter(x => {
console.log(x.item.id.toString())
console.log(targetItemID.toString())
x.item.id.toString() === itemID.toString()
})
console.log(newArray);
Я ожидаю, что все совпадающие объекты будут добавлены в ‘newArray’. Я попытался проверить значения перед сравнением, они оба являются строками, они кажутся одинаковыми, но мой newArray по-прежнему пуст.
Ответ №1:
- Ваш второй объект не имеет
item
свойства и должен. - Вам нужен a
return
в вашейfilter
функции. - Вы должны сравнивать
x.item.id
сtargetItemID
, а неitemID
. Поскольку вы используетеconsole.log()
, вы бы увидели и ошибкуitemID id not defined
;).
myArray = [
{ item: { id: 111557 } },
{ item: { id: 500600 } }
];
targetItemID = '111557'
var newArray = myArray.filter(x => {
//console.log(x.item.id.toString())
//console.log(targetItemID.toString())
return x.item.id.toString() === targetItemID.toString();
});
console.log(newArray);
Комментарии:
1. да, ему нужно вернуть условие
2. о да, это опечатка. ключевое слово return было проблемой для меня, оно решено, спасибо
3. @neiloth Пожалуйста, проголосуйте за все ответы и подумайте о том, чтобы отметить этот ответ как «the».
Ответ №2:
Здесь есть несколько проблем. Во-первых, не все ваши объекты имеют item
свойство, поэтому вам нужно проверить, существует ли оно. Во-вторых, вы сравниваете их с несуществующим itemID
вместо targetItemID
, и, наконец, и @bryan60 упоминал, что если вы открываете блок в анонимном лямбда-выражении, вам нужен явный return
оператор, хотя, честно говоря, вам действительно не нужен блок в этом случае:
var newArray =
myArray.filter(x => x.item amp;amp; x.item.id amp;amp; x.item.id.toString() === targetItemID)
Ответ №3:
для работы фильтра необходимо вернуться:
return x.item.id.toString() === itemID.toString();
Комментарии:
1. О, спасибо, хороший улов 🙂 Я отмечу как правильный ответ через 9 минут.
2. Дело не только в этом. Смотрите мой ответ.
3. @ScottMarcus я не знаю, как я не увидел ваш ответ первым 🙂 спасибо, я отмечу ваш.
4. @ScottMarcus true не прочитал это внимательно / предположил, что это опечатки