Массив массивов массивов javascript
Скажем, у нас есть следующий массив 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);
}
Ответы
Ответ 1
вы можете создать хэш.
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]);
}
Ответ 2
Вы также можете использовать трюк с сериализацией 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
Вы можете попробовать это?
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;
}
}
Ответ 4
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
.
Ответ 5
Я предполагаю, что такой возможности 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;
}
Ответ 6
Проблема с этим - это проблема равенства объектов/массивов в 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
}
}
Это почти наверняка будет значительно медленнее.
Ответ 7
Вы можете использовать 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);
Ответ 8
Почему бы вам не использовать функции массива 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() и some()
Ответ 9
Вы можете использовать преобразование 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
Ответ 10
Используйте это вместо
if (ar.join(".").indexOf(val) > -1) {
return true;
} else {
return false;
}