2015-05-14 4 views
3

Это мой первый вопрос здесь, после того, как он читал годами, так что будьте добры со мной, пожалуйста.Пустые элементы в объявлении массива JS

У меня возникли проблемы с управлением массивами в js/jq.

У меня есть массив с несколькими элементами, который обрабатывается с помощью функции $ .each. Я хочу извлечь соответствующие элементы в другой массив и вернуть этот массив. Но почему-то (не знаю, связано ли это с объявлением массива, функцией jquery.each ...) У меня есть первый пустой элемент.

Я думаю, что я делаю это более трудным для понимания, чем это, поэтому сделал jsfiddle.

var arr = new Array(); 
$.each([1,2,3], function(index,element){ 
    if (element == 2){ 
     arr[index] = element; 
    } 
}); 

arr должен иметь только 1 элемент, но arr.length возвращает 2, потому что первый слот массива пуст.

Вот скрипка http://jsfiddle.net/moay7y95/

Я уверен, что это простой и немного глупо, но я не смог найти ответ.

Заранее благодарен!

+0

Я думал о том, если использовать массив является лучшим способом сделать это. Наконец, я собираюсь использовать объекты, объявляющие arr, как arr = {}. С объектами, я могу иметь индекс как [1,4,5,6] без проблем. Спасибо за все ответы! –

ответ

3

Лучшее решение: Используйте .filter

var arr = [1, 2, 3].filter(function(value){ 
    return value == 2 
}); 

Если возвращаемое значение истинно, то элемент включается в возвращаемый массив, в противном случае он игнорируется. Это чистый js, поэтому вам не нужен jquery. Обратитесь к документации о .filter

Ваша задача: Используйте .push

Попробуйте использовать метод .push на массиве (см Mozilla's documentation).

var arr = new Array(); 
$.each([1,2,3], function(index,element){ 
    if (element == 2){ 
     arr.push(element); 
    } 
}); 

.push Метод будет динамически расти ваш массив по мере добавления элементов.

Ваша проблема в том, что значение index внутри вашей функции является контрольной точкой в ​​вашем начальном массиве. Это означает, что если вы посмотрите на возвращенный массив, вы найдете [undefined, 2], и поэтому длина возвращается как 2. Если ваше условие было element == 3, у вас было бы два пустых слота.

В качестве альтернативы: Использование .grep

Другой метод JQuery является $.grep. См http://api.jquery.com/jquery.grep/

var arr = $.grep([1, 2, 3], function (value) { 
    return value == 2 
}); 

Это реализация JQuery о в JavaScript .filter.

+0

Большое спасибо. Я знаю, что stackoverflow работает очень хорошо, но не так много! Я был смущен массивами и объектами json (которые я использую), не думал о том, что индексы массива начинаются с 0. Теперь все ясно. –

2

Вы нажимаете элемент в массиве на 1 индекс. Итак, javascript по умолчанию ставит undefined на 0-й индекс.

Так, в конце each ваш массив будет

[undefined, 2]; 

Это причина, вы получите length, как 2.

Вы можете использовать push добавить элемент в массиве:

$.each([1, 2, 3], function (index, element) { 
    if (element == 2) { 
     arr.push(element); 
     elem++; 
    } 
}); 

Демонстрация: https://jsfiddle.net/tusharj/moay7y95/2/

Метод push() добавляет один или несколько элементов в конец массива и возвращает новую длину массива.

Docs: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/push

0
[1, 2, 3] 

if (element == 2) 

arr[index] = element; 

Это означает, что вы установка обр [1] к элементу.

Если вы хотите, чтобы добавить его в обр последовательно (заполнение его нормально), толкать его в искусство

arr.push(element);

2

Ваш массив [1, 2, 3] состоит из трех элементов, и три связанных индексов: 0, 1 и 2. На каждой итерации цикла $.each() над этим массивом индекс и его значение передаются функции.

Таким образом, первый вызов получает 0, 1 в качестве аргументов. Второй вызов получает 1, 2 передается в качестве аргументов, то условие if утверждения истинно, так что ваш код:

arr[index] = element; 

фактически эквивалентен

arr[1] = 2; 

Поскольку вы вставку элемента с индексом 1, вы в конечном итоге с пустым индексом 0.

вы могли бы вместо того, чтобы просто использовать Array.push(), чтобы добавить элемент в массив:

arr.push(element); 
2

Как уже упоминалось проблема вы присваиваете значение с индексом 1, так что массив будет рассматриваться длины 2.

Одним из решений является использование .С() вместо назначения на основе индекса.

Другой подход может быть должен использовать Array.filter() и возвращает истину, если элемент совпадает с Conditon

var arr = [1, 2, 3].filter(function(value){ 
    return value == 2 
}); 

Демо: Fiddle


Использование $.grep()

var arr = $.grep([1, 2, 3], function (value) { 
    return value == 2 
}); 
0

Кажется, как вы ищу Array.filter (MDN).

var elems = ["car", "bike"]; 
var arr = [1, 2, 3, "car", 5, "bike"].filter(myFilterFunc); 

function myFilterFunc(val) { 
    if (elems.indexOf(val) > -1) return true; 
} 

Fiddle

Смежные вопросы