Как добавить элемент в массив, если он был найден?

Я использую этот метод для поиска объекта в массиве:

lat arr = [];
found = this.obj[objKey].filter(item => item[internKeyName] == 7047);
arr.push(found);

Проблема в том, что если элемент не был найден, он добавил его как undefined в массив arr. Как этого избежать?

Почему не находит элемент с ключом: "subjectId":

let objKey = 7047;
let k = "subjectId";
let v = 7047;

found = this.obj[objKey].filter(item => item[k] == v);

console.info(found);// undefined

Как добавить элемент в массив, если он был найден?

что должен делать фильтр? где определяется internKeyName и почему это значение жестко запрограммировано?

Nina Scholz 02.04.2018 17:51

Надеюсь, вы нашли правильный ответ, но, честно говоря, имейте в виду, что нам нужен полный пример для вопросов по коду. Пример должен быть действительно работоспособным, где это возможно, и активно демонстрировать проблему, с которой вы столкнулись.

zfrisch 02.04.2018 17:57

что не работает с реальным кодом? Вы проверили, что у вас есть массив для фильтрации?

Nina Scholz 02.04.2018 18:48

Я использую неправильную функцию, вместо этого нахожу, что использую фильтр, это ошибка

dooglu 02.04.2018 18:48
filter может быть полезен для поиска более чем одного объекта по заданному условию.
Nina Scholz 02.04.2018 18:59
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
5
275
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Этого можно избежать, проверив длину found перед тем, как поместить ее в массив.

lat arr = [];
found = this.obj[objKey].filter(item => item[internKeyName] == 7047);
found.length > 0 && arr.push(...found);

Я использую синтаксис распространения, чтобы протолкнуть каждый элемент как отдельный элемент в новый массив, и я предполагаю, что это то, что вы хотите. Вы можете удалить ..., если хотите, чтобы все найденные элементы были его собственным элементом массива.

found всегда есть true.
Nina Scholz 02.04.2018 17:50

Ой, я видел, что это x.find

Get Off My Lawn 02.04.2018 17:51

Почему вы используете ...found?

dooglu 02.04.2018 18:01

Это называется Spread Syntax, он в основном принимает массив и передает их как отдельные параметры. Подробнее об этом можно прочитать здесь: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

Get Off My Lawn 02.04.2018 18:03
Ответ принят как подходящий

Функция filter не вернет undefined, вместо этого вернет пустой массив (если ни один элемент не удовлетворял условию).

Problem is that if element was not found it added this as undefined to array arr.

Вероятно, вы захотите найти определенный элемент, поэтому я рекомендую вам использовать функцию find, если вам нужен только один объект, а не массив с одним индексом.

lat arr = [];
found = this.obj[objKey].find(item => item[internKeyName] == 7047);
if (found) arr.push(found);

@dooglu, можете ли вы опубликовать Минимальный, полный и проверяемый пример или хотя бы дополнительную информацию о контексте this? Я имею в виду, в основном больше кода.

Ele 02.04.2018 18:32

Вы можете напрямую протолкнуть расширенный массив с нужными объектами, пустые массивы не распространяются (синтаксис распространения ...).

arr.push(...this.obj[objKey].filter(item => item[internKeyName] == 7047));

Другие вопросы по теме