Есть такие данные
var obj = {
spa_3428: [ 2,4,6 ],
spa_3361: [ 4,6,7,8,9 ],
spa_1412: [ 2,4,6,7,9 ],
spa_4105: [ 4,6,8,9 ],
spa_5072: [ 4,6,7,9 ],
spa_5042: [ 4,7,8,9 ],
spa_4005: [ 4,6,7,8,9 ]
}
Необходимо пробежаться и найти в каком массиве объекта spa_ нет положим цифры 7 — это spa_4105, spa_3428
не пойму как это сделать, запутался уже?
Спасибо.
Не понял вопроса. Это и есть поиск по массиву, indexOf — метод прототипа массива, возвращает индекс первого вхождения, если нет — -1. Нужны аналоги isset — in и hasOwnProperty (без учета прототипа).
так понял что indexOf ищет по строке, т.е. и 123456 будет работать и 1,2,3,4 — не обязательна структура данных — массив.
т.е. вероятно поиск по индексу массива будет быстрее чем по строке
поэтому и спрашиваю
Битовый оператор и логический с числом — всё-таки не самая ясная запись. Почему бы не так:
Object.keys(obj).filter(function(key){ return obj[key].indexOf(7)>=0; })
Или короче:
Object.keys(obj).filter(function(x) obj[key].indexOf(7)>=0)
Может быть и не самая ясная запись — но я уже привык к записи такой — и читаю как: ~str.indexOf(7) — has 7, a !~str.indexOf(7) — doesnt have 7, поэтому довольно ясно. Но соглашусь, что такая запись не совсем привычная, и порой в командных/паблик проектах сравниваем с -1 — str.indexOf(7) === -1 и str.indexOf(7) !== -1 соответственно. А сравниваем не через >/>=, что бы подчеркнуть, что поиск не по определённому индексу, а на вхождение в целом. Нюанс конечно, но бросается в глаза.
А что это за короткая запись такая? В каком интерпретаторе поддерживается?
Тут два пути — поэлементный поиск (последовательно или рекурсивно, циклом или callback, не важно) либо сериализуем (самое быстрое — JSON.stringify) все данные или поэлементно и уже ищем подстроки ",7,", "[7" и ",7]"