javascript поиск в массиве массивов - PullRequest
17 голосов
/ 11 июня 2011

Допустим, у нас есть следующий массив js

var ar = [
   [2,6,89,45],
   [3,566,23,79],
   [434,677,9,23]
];

var val = [3,566,23,79];

Существует ли встроенная функция js или jQuery, с помощью которой можно искать в массиве ar для val ?

Спасибо

*** UPDATE **** *********

Принимая ответ fusion Я создал этот прототип

Array.prototype.containsArray = function(val) {
    var hash = {};
    for(var i=0; i<this.length; i++) {
        hash[this[i]] = i;
    }
    return hash.hasOwnProperty(val);
}

Ответы [ 9 ]

21 голосов
/ 11 июня 2011

вы можете создать хеш.

var ar = [
    [2,6,89,45],
    [3,566,23,79],
    [434,677,9,23]
];

var hash = {};
for(var i = 0 ; i < ar.length; i += 1) {
    hash[ar[i]] = i;
}

var val = [434,677,9,23];

if(hash.hasOwnProperty(val)) {
    document.write(hash[val]);
}
4 голосов
/ 09 декабря 2015

Вы также можете использовать трюк с сериализацией JSON.Это короткий и простой, но довольно хакерский вариант.
Это работает, потому что "[0,1]" === "[0,1]".

Вот рабочий фрагмент демонстрации:

Array.prototype.indexOfForArrays = function(search)
{
  var searchJson = JSON.stringify(search); // "[3,566,23,79]"
  var arrJson = this.map(JSON.stringify); // ["[2,6,89,45]", "[3,566,23,79]", "[434,677,9,23]"]

  return arrJson.indexOf(searchJson);
};

var arr = [
   [2,6,89,45],
   [3,566,23,79],
   [434,677,9,23]
];

document.body.innerText = arr.indexOfForArrays([3,566,23,79]);
3 голосов
/ 20 сентября 2011
function indexOfArray(val, array) {
  var
    hash = {},
    indexes = {},
    i, j;
  for(i = 0; i < array.length; i++) {
    hash[array[i]] = i;
  }
  return (hash.hasOwnProperty(val)) ? hash[val] : -1;
};

Я считаю это более полезным, чем containsArray(). Он решает ту же проблему, но возвращает индекс, а не просто логическое значение true или false.

3 голосов
/ 11 июня 2011

Можете ли вы попробовать это?

var ar = [
   [2,6,89,45],
   [3,566,23,79],
   [434,677,9,23]
];

var val = [3,566,23,79];


var sval = val.join("");
for(var i in ar)
{
    var sar = ar[i].join("");
    if (sar==sval) 
    {
        alert("found!");
        break;
    }
}
1 голос
/ 11 ноября 2016

Вы можете использовать Array.prototype.some(), Array.prototype.every() для проверки каждого элемента каждого массива.

var ar = [
  [2, 6, 89, 45],
  [3, 566, 23, 79],
  [434, 677, 9, 23]
];

var val = [3, 566, 23, 79];

var bool = ar.some(function(arr) {
  return arr.every(function(prop, index) {
    return val[index] === prop
  })
});

console.log(bool);
1 голос
/ 11 июня 2011

Проблема с этим заключается в равенстве объектов / массивов в Javascript. По сути, проблема в том, что два массива не равны, даже если они имеют одинаковые значения. Вам нужно пройтись по массиву и сравнить элементы с ключом поиска (val), но вам потребуется способ точного сравнения массивов.

Самый простой способ обойти это - использовать библиотеку, которая позволяет сравнивать массивы и объекты. underscore.js имеет очень привлекательный способ сделать это:

for (var i = 0; i < ar.length; i++) {
    if (_.isEqual(ar[i], val)) {
        // value is present
    }
}

Если вы не хотите использовать другую библиотеку (хотя я призываю вас - или, по крайней мере, позаимствовать сообщение из источника Underscore), вы можете сделать это с помощью JSON.stringify ...

var valJSON = JSON.stringify(val);
for (var i = 0; i < ar.length; i++) {
    if (valJSON === JSON.stringify(ar[i]) {
        // value is present
    }
}

Это почти наверняка будет значительно медленнее.

1 голос
/ 11 июня 2011

Полагаю, таких функций JS нет. но вы можете создать один

function arrEquals( one, two )
{
    if( one.length != two.length )
    {
        return false;
    }
    for( i = 0; i < one.length; i++ )
    {
        if( one[i] != two[i] )
        {
            return false;
        }
    }
    return true;
}
0 голосов
/ 30 мая 2019

Вы можете использовать преобразование toString для сравнения элементов

var ar = [
   [2,6,89,45],
   [3,566,23,79],
   [434,677,9,23]
];

var val = [3,566,23,79];

s = !ar.every(a => (a.toString() != val.toString()));
console.log(s) // true
0 голосов
/ 17 августа 2016

Почему вы не используете функции массива javascript?

function filterArrayByValues(array, values) {
            return array.filter(function (arrayItem) {
                return values.some(function (value) {
                    return value === arrayItem;
                });
            });
        }

Или, если ваш массив более сложный, и вы хотите сравнить только одно свойство, но в результате вернуть весь объект:

  function filterArrayByValues(array, values, propertyName) {
            return array.filter(function (arrayItem) {
                return values.some(function (value) {
                    return value === arrayItem[propertyName];
                });
            });
        }

Подробнее об используемых функциях: filter () и некоторые ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...