简体   繁体   中英

javascript search array of arrays

Let's say we have the following js array

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

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

Is there a js builtin function or jQuery one with which you can search the array ar for val ?

Thanks

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

Taking fusion's response I created this prototype

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

you could create a 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]);
}

You can also use a trick with JSON serializing. It is short and simple, but kind of hacky.
It works, because "[0,1]" === "[0,1]" .

Here is the working demo snippet:

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

I consider this more useful for than containsArray() . It solves the same problem (using a hash table ) but returns the index (rather than only boolean true / false ).

Can you try this?

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

Why don't you use javascript array functions?

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

Or if your array is more complicated, and you want compare only one property but as result return whole object:

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

More about used functions: filter() and some()

You can use Array.prototype.some() , Array.prototype.every() to check each element of each array.

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

I guess there is no such JS functionality available. but you can create one

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

The problem with this is that of object/array equality in Javascript. Essentially, the problem is that two arrays are not equal, even if they have the same values. You need to loop through the array and compare the members to your search key ( val ), but you'll need a way of accurately comparing arrays.

The easiest way round this is to use a library that allows array/object comparison. underscore.js has a very attractive method to do this:

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

If you don't want to use another library (though I would urge you to -- or at least borrow the message from the Underscore source), you could do this with JSON.stringify ...

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

This will almost certainly be significantly slower, however.

You can use toString convertion to compare elements

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

Use this instead

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

Use 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]]

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM