Как я могу вставить в массив, если ни одно из значений не существует? Вот мой массив:
[
{ name: "tom", text: "tasty" },
{ name: "tom", text: "tasty" },
{ name: "tom", text: "tasty" },
{ name: "tom", text: "tasty" },
{ name: "tom", text: "tasty" }
]
Если я попытаюсь снова протолкнуть массив с помощью name: "tom"
или text: "tasty"
, я не хочу, чтобы что-то происходило ... но если ни одного из них нет, я хочу, чтобы это произошло.push()
Как я могу это сделать?
javascript
arrays
json
push
not-exists
tarnfeld
источник
источник
Ответы:
Вы можете расширить прототип Array с помощью специального метода:
источник
Array.findIndex()
это встроенная функция JS, которая будет выполнять то же, что и ваш код.Для массива строк (но не для массива объектов) вы можете проверить, существует ли элемент, вызвав его,
.indexOf()
а если нет, то просто вставить элемент в массив:источник
if (a.indexOf({ name: "tom", text: "tasty" })!=-1) a.push({ name: "tom", text: "tasty" })
дважды. Это добавит «похожий» объект дважды.Это довольно легко сделать с помощью
Array.findIndex
функции, которая принимает функцию в качестве аргумента:источник
http://api.jquery.com/jQuery.unique/
вы можете быть заинтересованы в makeArray тоже
В предыдущем примере лучше всего сказать, что перед нажатием проверьте, существует ли он. Оглядываясь назад, я также вижу, что вы можете объявить его как часть прототипа (я думаю, это также расширение класса), так что никаких значительных улучшений ниже.
Только я не уверен, что indexOf - более быстрый маршрут, чем inArray? наверное.
источник
Note that this only works on arrays of DOM elements, not strings or numbers.
Кроме того, indexOf не работает в IE8 :(Именно по этим причинам используйте библиотеку js, например underscore.js . Использование: union: вычисляет объединение переданных массивов: список по порядку уникальных элементов, присутствующих в одном или нескольких массивах.
источник
Как это?
С объектом
источник
array.find
это плохая идея, потому что он ищет весь массив. ИспользуйтеfindIndex
, который ищет только до первого вхождения.Я знаю, что это очень старый вопрос, но если вы используете ES6, вы можете использовать очень маленькую версию:
Очень просто, сначала добавьте фильтр, который удаляет элемент - если он уже существует, а затем добавьте его через concat.
Вот более реалистичный пример:
Если ваш массив содержит объекты, вы можете адаптировать функцию фильтра следующим образом:
источник
Нажмите динамически
Простым способом
Если массив содержит только примитивные типы / простой массив
источник
Я бы предложил вам использовать набор ,
Наборы разрешают только уникальные записи, что автоматически решает вашу проблему.
Наборы могут быть объявлены так:
источник
Array.push
, так лиSet.add
это эквивалентно?Простой код: если 'indexOf' возвращает '-1', это означает, что элемент не находится внутри массива, тогда условие '=== -1' возвращает true / false.
Оператор & & означает «и», поэтому, если первое условие истинно, мы помещаем его в массив.
источник
Не уверен насчет скорости, но
stringification
+indexOf
это простой подход. Начните с превращения вашего массива в строку:Тогда для серии пар атрибут-значение вы можете использовать:
Найти весь объект проще:
источник
В случае, если вам нужно что-то простое, не желая расширять прототип Array:
источник
В случае, если у кого-то есть менее сложные требования, вот моя адаптация ответа для простого строкового массива:
Обновление: заменен indexOf и дополнен альтернативами jQuery для совместимости с IE8.
источник
Я использовал map и Reduce, чтобы сделать это в случае, когда вы хотите выполнить поиск по определенному свойству объекта, что полезно, поскольку прямое равенство объектов часто заканчивается неудачей.
источник
Краткий пример:
источник
а это массив объектов у вас есть
источник
Вы можете использовать метод findIndex с функцией обратного вызова и его параметром this.
Примечание: старые браузеры не знают findIndex, но полифилл доступен.
Пример кода (позаботьтесь о том, чтобы в исходном вопросе новый объект выдвигался, только если ни один из его данных не находится в предварительно выдвинутых объектах):
источник
Я полагаю, что уже слишком поздно, чтобы ответить здесь, но это то, что я наконец-то придумал для почтового менеджера, которого я написал. Работы это все что мне нужно.
источник
Это рабочая функция для сравнения объектов. В некоторых случаях у вас может быть много полей для сравнения. Просто зациклите массив и вызовите эту функцию с существующими элементами и новым элементом.
источник
Здесь у вас есть способ сделать это в одну строку для двух массивов:
источник
Вы можете использовать jQuery grep и нажать, если нет результатов: http://api.jquery.com/jQuery.grep/
Это в основном то же решение, что и в решении «расширение прототипа», но без расширения (или загрязнения) прототипа.
источник
Вы можете проверить массив с помощью foreach, а затем вытолкнуть элемент, если он существует, иначе добавить новый элемент ...
образец newItemValue & submitFields являются ключом, парами значений
источник