如何检查Object中是否存在数字数组

时间:2013-12-01 20:16:51

标签: javascript jquery

我正在尝试编写一些代码来检查对象中是否存在数组中存储的数字。使用我现在的代码,它总是返回-1。

function checkHorizonal() {
    var x= ['1', '2' ,'3'];
    var y= ['4', '5', '6'];
    var z= ['7', '8', '9']


        console.log(jQuery.inArray(x, squaresClicked));

}

这是squaresClicked对象内容:

Object {1: "1", 2: "-1", 3: "1"}

您可以看到键1,2,3存在,但它将返回-1。

2 个答案:

答案 0 :(得分:1)

jQuery的inArray无法处理一组针,否则

$.inArray(x, Object.keys(squaresClicked));

会工作的。在这种情况下,你会陷入迭代,我想(尽管可能还有其他一些棘手的方法 - 一如既往)。 jQuery的一种方式(虽然我不太喜欢它因各种原因 1 ):

var hasFailed = false;
$.each(x, function (index, value) {
    if($.inArray(value, Object.keys(squaresClicked)) === -1) {
        hasFailed = true;
    }
});

return !hasFailed;

基本的vanillaJS方法:

for(var i = 0; i < x.length; i++) {
    if(!squaresClicked.hasOwnProperty(x[i])) {
        return false;
    }
}

return true;

1 我不喜欢它的两个原因:

  • 它会迭代整个数组,即使它已经很清楚它会失败
  • 它在逻辑中使用双重否定

答案 1 :(得分:1)

来自jQuery doc:

jQuery.inArray( value, array [, fromIndex ] )

jQuery.inArray无法按照您使用它的方式运行。它检查数组内容,而不是对象键。您的值x很好,但您传入的是对象而不是数组。

如果您正在尝试查看一组整数是否作为对象中的键存在,则可以尝试以下操作(假设您使用的是JavaScript&gt; = 1.6):

myArray.filter(function(x) {
  // check if value is a key
  return (x in squaresClicked);
}).length == myArray.length;

基本上,我们遍历数组,只返回在对象squaresClicked 中作为键存在的数组。如果新数组的长度与原始列表的长度相同,则值必须全部作为对象中的属性存在。

如果您不想为数组值查找对象的整个原型链,则需要使用hasOwnProperty而不是in

像这样:

return (squaresClicked.hasOwnProperty(x));

您可以详细了解此方法here