javascript 搜索数组的数组

问题描述 投票:0回答:14

假设我们有以下 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

谢谢

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

根据 fusion 的响应我创建了这个原型

Array.prototype.containsArray = function(val) {
    var hash = {};
    for(var i=0; i<this.length; i++) {
        hash[this[i]] = i;
    }
    return hash.hasOwnProperty(val);
}
javascript arrays search
14个回答
29
投票

你可以创建一个哈希。

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

8
投票

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


5
投票
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()
更有用。它解决了同样的问题(使用 哈希表 ),但返回索引(而不仅仅是布尔值
true
/
false
)。


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

3
投票

您可以使用

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


2
投票

为什么不使用 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()


1
投票

我猜没有这样的 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;
}

1
投票

问题在于 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
    }
}

然而,这几乎肯定会慢得多。


0
投票

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

用这个代替

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

0
投票

使用lodash isEqual

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

0
投票

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


0
投票

您可以简单地对原始值(数组内)执行字符串比较:

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

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

for (const item of ar) {
  if (item.toString() == val.toString()) {
    console.log(`item found at index: ${ar.indexOf(item)}`);
  }
}

对于非原始值(如

[3, 566, 23, {foo: 'foo'}]
),您可以使用
JSON.stringify()
:

检查它
if (JSON.stringify(item) == JSON.stringify(val)) {

然而,前面的字符串比较可能会产生错误的结果。


或者,您可以使用条目:

for (const [index, value] of ar.entries()) {
  if (value.toString() == val.toString()) {
    console.log(`item found at index: ${index}`);
  }
}

0
投票

如果您有主列表并且想要检查第二个列表是否包含主列表 您可以使用以下方法:

    let classList= ['ant-btn', 'css-dev-only-do-not-override-nllxry', 'ant-btn-default', 'ant-btn-icon-only', 'ant-btn-rtl', 'edit', 'ant-tooltip-open']
classList.filter(a=>['changePassword','edit','showPermission'].indexOf(a)>0)
© www.soinside.com 2019 - 2024. All rights reserved.