2010-08-25 1 views
5

У меня есть массив объектов в javascript. Я использую jquery.Получить первый элемент разреженного массива JavaScript

Как получить первый элемент в массиве? Я не могу использовать индекс массива - поскольку я назначаю индекс каждого элемента, когда добавляю объекты в массив. Итак, индексы arent 0, 1, 2 и т. Д.

Просто нужно получить первый элемент массива?

+1

Что вы используете в качестве индекса массива тогда? –

ответ

4

Если вы не используете последовательно пронумерованные элементы, вам придется перебрать, пока не попал в первый:

var firstIndex = 0; 
while (firstIndex < myarray.length && myarray[firstIndex] === undefined) { 
    firstIndex++; 
} 
if (firstIndex < myarray.length) { 
    var firstElement = myarray[firstIndex]; 
} else { 
    // no elements. 
} 

или какой-то то же самое глупое конструкцию. Это дает вам индекс первого элемента, который вам может или не нужно.

Если это то, что вам нужно делать часто, вы должны сохранить ссылку на текущий первый действительный индекс, так что это становится операцией O (1) вместо O (n) каждый раз. Если вам часто требуется итерация по действительно разреженному массиву, рассмотрите другую структуру данных, например, поддерживая объект рядом с ним, который возвращает исходные данные в индексы или что-то, что соответствует вашим данным.

+1

Остерегайтесь пустых массивов. – Douglas

+0

Спасибо, отредактирован. –

+1

Это может быть ужасно неэффективным в зависимости от самого низкого индекса. – Jasper

4

Метод filter работает с разреженными массивами.

var first = array.filter(x => true)[0]; 
+2

-1. Некорректное; это не отвечает на вопрос. OP хочет первый «действительный» элемент, независимо от его индекса (не обязательно нуля). 'shift' будет только снимать все, что находится в элементе 0, включая' undefined'. –

+0

Моя ошибка, отредактированная для альтернативы, вместо добавления другого ответа, который может ввести в заблуждение других. –

+0

@GeorgeJempty Вероятно, потому что он использовал 'filter', поэтому я понял, что« достаточно близко », но вы правы. Мое редактирование было слишком резким. – aleclarson

0

Если вы окажетесь необходимости делать манипуляции массивов много, то вы можете быть заинтересованы в Underscore библиотеке. Он предоставляет методы утилиты для редактирования массивов, например compact:

var yourArray = []; 
yourArray[10] = "foo"; 
var firstValue = _.compact(yourArray)[0]; 

Однако, это звучит, как вы делаете что-то странное, когда вы строите свой массив. Возможно, Array.push поможет вам?

2

Рассматривали ли вы:

function getFirstIndex(array){ 
    var result; 
    if(array instanceof Array){ 
     for(var i in array){ 
      result = i; 
      break; 
     } 
    } else { 
     return null; 
    } 
    return result; 
} 

?

И как способ получить последний элемент в массиве:

function getLastIndex(array){ 
    var result; 
    if(array instanceof Array){ 
      result = array.push(""); 
      array.pop; 
     } 
    } else { 
     return null; 
    } 
    return result; 
} 

Ни один из них использует JQuery.

2

Object.keys(array)[0] возвращает индекс (в форме String) первого элемента в разреженном массиве.

var array = []; 
array[2] = true; 
array[5] = undefined; 

var keys = Object.keys(array);   // => ["2", "5"] 
var first = Number(keys[0]);    // => 2 
var last = Number(keys[keys.length - 1]); // => 5 
0

Я также столкнулся с подобной проблемой, и был удивлен, что никто не считается следующее:

var testArray = []; 
testArray [1245]= 31; 
testArray[2045] = 45; 
for(index in testArray){ 
    console.log(index+','+testArray[index]) 
} 

выше будет производить

1245,31 
2045,45 

В случае необходимости вы могли бы существовать после того, как первая итерация, если все, что требовалось, но в целом нам нужно знать, где в массиве начать.

1

Это предложение с использованием метода ES5 с Array#some.

Код получает первый непрозрачный элемент и индекс. Итерация немедленно прекращается с возвратом true в функции обратного вызова:

var a = [, , 22, 33], 
 
    value, 
 
    index; 
 

 
a.some(function (v, i) { 
 
    value = v; 
 
    index = i; 
 
    return true; 
 
}); 
 

 
console.log(index, value);

-1

Вы также можете использовать этот многоразовый с открытым исходным кодом array-first component, который возвращает первый элемент данного массива.

Примеры:

first([1, 2, 3]) // => 1 
first(['a', 'b', 'c']) // => 'a' 
+0

Они спрашивают о ** редком ** массиве, а не о нормальном массиве. – aleclarson