2013-12-01 2 views
0

Я пытаюсь написать код, который будет проверять, существует ли группа чисел, хранящихся в массиве, в объекте. С кодом, который у меня есть, он всегда возвращает -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.

ответ

1

С JQuery документ:

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

jQuery.inArray не будет работать так, как вы находитесь используй это. Он проверяет содержимое массива, а не клавиши объекта. Ваше значение x прекрасно, но вы передаете объект вместо массива.

Если вы пытаетесь увидеть, если множество целых чисел существует в качестве ключей в объекте, вы можете попробовать следующее (при условии, что вы используете JavaScript> = 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.

+0

Как вывести согласованные целые числа в консоль – Yamaha32088

+1

сохранить логический результат в переменной. Например: var res = (x в квадратахClicked). Тогда console.log (x), если это правда. – linstantnoodles

1

JQuery-х inArray не может иметь дело с множеством игл, иначе

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

работало бы. В этом случае вы застряли с итерированием, я думаю (хотя может быть и другой сложный путь - как всегда). Один из способов JQuery (хотя я не очень люблю по разным причинам):

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; 

Два из причины, по которым мне это не нравится:

  • Это будет итерация по всему массив, даже если это уже ясно, что она не будет выполнена
  • Он использует двойное отрицание в своей логике
Смежные вопросы