проблема сравнения строк javascript в array.filter()

#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 не прочитал это внимательно / предположил, что это опечатки