簡體   English   中英

javascript 搜索 arrays 的數組

[英]javascript search array of arrays

假設我們有以下 js 數組

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

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

是否有內置 function 或 jQuery 的 js,您可以使用它在數組ar中搜索val

謝謝

** *更新* ** * ** * ** * ** *

根據Fusion 的回應,我創建了這個原型

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

你可以創建一個 hash。

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]);
}

您還可以使用 JSON 序列化的技巧。 它簡短而簡單,但有點hacky。
它有效,因為"[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]);

function indexOfArray(val, array) {
  var hash = {};
  for (var i = 0; i < array.length; i++) {
    hash[array[i]] = i;
  }
  return (hash.hasOwnProperty(val)) ? hash[val] : -1;
};

我認為這比containsArray()更有用。 它解決了同樣的問題(使用hash 表)但返回索引(而不僅僅是 boolean true / false )。

你能試試這個嗎?

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;
    }
}

為什么不使用 javascript 數組函數?

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

或者,如果您的數組更復雜,並且您只想比較一個屬性,但結果返回整個 object:

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

更多關於使用的函數: filter()some()

您可以使用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);

我想沒有這樣的 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;
}

問題在於 Javascript 中的對象/數組相等。 本質上,問題在於兩個 arrays 不相等,即使它們具有相同的值。 您需要遍歷數組並將成員與您的搜索鍵 ( val ) 進行比較,但您需要一種准確比較 arrays 的方法。

最簡單的方法是使用允許數組/對象比較的庫。 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
    }
}

然而,這幾乎肯定會明顯變慢。

您可以使用 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

改用這個

if (ar.join(".").indexOf(val) > -1) {
 return true;
} else {
 return false;
}

使用 lodash isEqual

const isValIncludedInAr = ar.some(element => isEqual(element, val)) 

 const arrayOne = [2,6,89,45]; const arrayTwo = [3,566,23,79]; const arrayThree = [434,677,9,23]; const data = new Set([arrayOne, arrayTwo, arrayThree]); // Check array if exist console.log( data.has(arrayTwo) ); // It will return true. // If you want to make a set into array it's simple const arrayData = [...data]; console.log(arrayData); // It will return [[2,6,89,45], [3,566,23,79], [434,677,9,23]]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM