У меня есть массив как
vendors = [
{
Name: 'Magenic',
ID: 'ABC'
},
{
Name: 'Microsoft',
ID: 'DEF'
} //and so on goes array...
];
Как проверить этот массив, чтобы увидеть, существует ли Magenic? Я не хочу зацикливаться, если я не должен. Я работаю с потенциально несколькими тысячами записей.
ОБНОВЛЕНО
Поскольку это был популярный пост, я решил поделиться чем-то новым, что нашел. И, кажется, @CAFxX уже поделился этим! Я должен читать это чаще. Я наткнулся на https://benfrain.com/understanding-native-javascript-array-methods/ .
vendors.filter(function(vendor){ return vendor.Name === "Magenic" })
А с ECMAScript 2015 стало еще проще использовать новые функции стрелок:
vendors.filter(vendor => vendor.Name === "Magenic")
javascript
arrays
Дэвид Лоцци
источник
источник
Ответы:
Редактирование 2018 года : этот ответ с 2011 года, до того, как браузеры широко поддерживали методы фильтрации массивов и функции стрелок. Посмотрите на ответ CAFxX .
Не существует «волшебного» способа проверить что-либо в массиве без цикла. Даже если вы используете какую-то функцию, сама функция будет использовать цикл. Что вы можете сделать, так это выйти из цикла, как только вы найдете то, что ищете, чтобы минимизировать время вычислений.
источник
'Magenic'
находится где-то еще в объектеНе нужно изобретать
рулевое колесоцикл, по крайней мере, явно (с использованием функций стрелок , только в современных браузерах ):или еще лучше :
РЕДАКТИРОВАТЬ: Если вам нужна совместимость с паршивыми браузерами, то ваш лучший выбор:
источник
some
может вызвать короткое замыкание, когда объект сname === "Magenic"
найден. С помощьюfilter
он будет проверять каждый элемент до конца массива и создавать новые элементы массива, которые соответствуют условию, а затем проверятьlength
Нет необходимости петли. Три метода, которые приходят на ум:
Array.prototype.some ()
Это самый точный ответ на ваш вопрос, то есть «проверьте, если что-то существует», что подразумевает результат bool. Это будет верно, если есть какие-либо «магические» объекты, иначе ложь:
Array.prototype.filter ()
Это вернет массив всех объектов Magenic, даже если он есть только один (вернет одноэлементный массив):
Если вы попытаетесь привести это к логическому значению, оно не будет работать, так как пустой массив (без объектов Magenic) все еще верен. Так что просто используйте
magenicVendors.length
в своих условных.Array.prototype.find ()
Это вернет первый Magenic-объект (или,
undefined
если его нет):Это приводит к булеву окей (любой объект правдив,
undefined
фальшив).Примечание: я использую vendor ["Name"] вместо vendor.Name из-за странного расположения имен свойств.
Примечание 2: Нет причин использовать свободное равенство (==) вместо строгого равенства (===) при проверке имени.
источник
Принятый ответ все еще работает, но теперь у нас есть собственный метод ECMAScript 6
[Array.find][1]
для достижения того же эффекта.Цитируя MDN:
Смотрите мою ссылку на jsfiddle. Существует полифил для IE, предоставляемый mozilla.
источник
return ele.id == '2'
, но +1 за хорошее решение ES6.push if <0 || splice(index, 1)
вот мой немного обновленный код:const index = this.selected.indexOf(this.selected.find(s => s.id == passedObj.id))
Вот как я это сделаю
array.some()
Метод проверяет, есть ли хотя бы одно значение в массиве, которое соответствует критериям, и возвращает логическое значение. С этого момента вы можете пойти с:источник
Если вы не хотите реструктурировать это так:
на что ты можешь
if(vendors.Magnetic)
Вам придется зациклить
источник
Согласно спецификации ECMAScript 6, вы можете использовать
findIndex
.const magenicIndex = vendors.findIndex(vendor => vendor.Name === 'Magenic');
magenicIndex
будет содержать0
( или это индекс в массиве), или-1
если он не был найден.источник
Как ОП задал вопрос, существует ли ключ или нет .
Более элегантное решение, которое будет возвращать логическое значение с использованием функции сокращения ES6, может быть
Примечание . Начальным параметром Reduce является a,
false
и если массив имеет ключ, он вернет true.Надеюсь, это поможет для лучшей и чистой реализации кода
источник
reduce
является аккумулятор, а неvendor
объект. Это проверяетfalse.Name === "Magenic"
каждый цикл и возвращает falseВы не можете, не глядя на объект на самом деле.
Вы, вероятно, должны немного изменить свою структуру, как
Тогда вы можете просто использовать его как хеш поиска.
источник
Может быть слишком поздно, но массив JavaScript имеет два метода
some
иevery
метод, который возвращает логическое значение и может помочь вам достичь этого.Я думаю,
some
что будет наиболее подходящим для того, что вы намерены достичь.Некоторые подтверждают, что любой из объектов в массиве удовлетворяет заданному условию.
Каждый проверяет, что все объекты в массиве удовлетворяют заданному условию.
источник
const array1 = [{name:'Mike'},{name:'Alice'}]; console.log(array1.every(item => item.name !== 'Mike'));
оно должно вернуть истинуsome
, обновлю мой ответ.Вы должны зацикливаться, нет никакого способа обойти это.
Конечно, вы можете использовать библиотеку вроде linq.js, чтобы сделать это более приятным:
(см. jsFiddle для демонстрации)
Я сомневаюсь, что linq.js будет быстрее, чем прямой цикл, но он, безусловно, будет более гибким, когда все немного сложнее.
источник
Тестирование для элементов массива:
JS предлагает функции массива, которые позволяют вам достичь этого относительно легко. Они следующие:
Array.prototype.filter
: Принимает функцию обратного вызова, которая является тестом, затем массив перебирается с обратным вызовом и фильтруется в соответствии с этим обратным вызовом. Новый отфильтрованный массив возвращается.Array.prototype.some
: Принимает функцию обратного вызова, которая является тестом, затем массив перебирается с помощью функции обратного вызова, и если какой-либо элемент проходит тест, возвращается логическое значение true. В противном случае возвращается falseОсобенности лучше всего объяснить на примере:
Пример:
Поддержка браузера:
Эти 2 функции являются
ES6
функциональными, не все браузеры могут их поддерживать. Чтобы преодолеть это, вы можете использовать полифилл. Вот полифилл дляArray.prototype.some
(из MDN):источник
если вы используете jquery, вы можете воспользоваться grep для создания массива со всеми соответствующими объектами:
а затем используйте массив результатов:
источник
Поправьте меня, если я ошибаюсь ... я мог бы использовать
forEach
такой метод,В настоящее время я привык к этому, из-за его простоты и понятного слова. Спасибо.
источник
Вы можете попробовать это для меня.
источник
Вы можете использовать lodash . Если библиотека lodash слишком тяжелая для вашего приложения, рассмотрите возможность разделения ненужной функции.
Это всего лишь один из способов сделать это. Еще один может быть:
console.log(arr);
Приведенный выше пример также можно переписать без использования таких библиотек, как:
Надеюсь, мой ответ поможет.
источник
Многие ответы здесь хороши и довольно просты. Но если ваш массив объектов имеет фиксированный набор значений, вы можете использовать следующий трюк:
Сопоставьте все имя в объекте.
Теперь этот dirtyObj можно использовать снова и снова безо всякого цикла.
источник
Чтобы сравнить один объект с другим, я объединяю цикл for (используется для циклического перемещения по объектам) и some (). Вам не нужно беспокоиться о выходе массива за пределы границ и т. Д., Чтобы сохранить некоторый код. Документацию по .some можно найти здесь
Альтернативный способ сравнения одного объекта с другим - использовать вложенный цикл for с Object.keys (). Length, чтобы получить количество объектов в массиве. Код ниже:
Чтобы ответить на ваш точный вопрос, если вы просто ищете значение в объекте, вы можете использовать один цикл for.
источник
В качестве альтернативы вы можете сделать:
источник
var without2 = (arr, args) => arr.filter(v => v.id !== args.id);
Пример:without2([{id:1},{id:1},{id:2}],{id:2})
Результат: без 2 ([{id: 1}, {id: 1}, {id: 2}], {id: 2})
источник
источник
Мой подход к решению этой проблемы заключается в использовании ES6 и создании функции, которая выполняет проверку за нас. Преимущество этой функции состоит в том , что он может повторно использоваться через вне вашего проекта , чтобы проверить любой массив объектов , учитывая
key
иvalue
проверить.Хватит говорить, посмотрим код
массив
функция
Вызов / Usage
источник
Я предпочел бы пойти с регулярным выражением.
Если ваш код выглядит следующим образом,
я бы порекомендовал
источник