2010-08-25 51 views
5

Tôi có một mảng đối tượng trong javascript. Tôi dùng jquery.Lấy phần tử đầu tiên của một mảng JavaScript thưa thớt

Làm cách nào để nhận được phần tử đầu tiên trong mảng? Tôi không thể sử dụng chỉ mục mảng - vì tôi chỉ định từng chỉ mục phần tử khi tôi thêm các đối tượng vào mảng. Vì vậy, các chỉ mục arent 0, 1, 2, v.v.

Chỉ cần lấy phần tử đầu tiên của mảng?

+1

gì bạn đang sử dụng như chỉ số mảng sau đó? –

Trả lời

4

Nếu bạn không sử dụng các yếu tố đánh số liên tục, bạn sẽ phải lặp qua cho đến khi bạn nhấn đầu tiên:

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

hoặc một số xây dựng tương đương ngớ ngẩn. Điều này giúp bạn trở thành chỉ mục của mục đầu tiên mà bạn có thể hoặc không quan tâm đến nó.

Nếu đây là điều bạn cần làm thường xuyên, bạn nên giữ tham chiếu hướng tới chỉ số hợp lệ đầu tiên hiện tại, do đó, điều này trở thành hoạt động O (1) thay vì O (n) mỗi lần. Nếu bạn thường xuyên phải lặp qua một mảng thực sự thưa thớt, hãy xem xét một cấu trúc dữ liệu khác, như giữ một đối tượng bên cạnh nó sao chép lại các kết quả thứ tự đến các chỉ mục hoặc thứ gì đó phù hợp với dữ liệu của bạn.

+1

Xem ra các mảng trống. – Douglas

+0

Cảm ơn, đã chỉnh sửa. –

+1

Điều này có thể không hiệu quả khủng khiếp tùy thuộc vào chỉ số thấp nhất. – Jasper

4

Phương thức filter hoạt động với các mảng thưa thớt.

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

-1. Sai; điều này không trả lời câu hỏi. OP muốn mục "hợp lệ" đầu tiên, bất kể chỉ số nào ở (không nhất thiết là 0). 'shift' sẽ chỉ kéo ra bất cứ thứ gì ở phần tử 0, bao gồm' undefined'. –

+0

Sai lầm của tôi, được chỉnh sửa thay thế, thay vì thêm một câu trả lời khác có thể đánh lừa người khác. –

+0

@GeorgeJempty Có lẽ vì nó đã sử dụng 'bộ lọc' nên tôi đã tìm ra" đủ gần ", nhưng bạn nói đúng. Chỉnh sửa của tôi quá quyết liệt. – aleclarson

0

Nếu bạn thấy mình cần thao tác nhiều mảng, bạn có thể quan tâm đến thư viện Underscore. Nó cung cấp phương pháp hữu ích đối với mảng thao tác, ví dụ compact:

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

Tuy nhiên, nó âm thanh như bạn đang làm một cái gì đó kỳ lạ khi bạn đang xây dựng mảng của bạn. Có lẽ Array.push sẽ giúp bạn?

2

Bạn đã xem:

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

?

Và như là một cách để có được những yếu tố cuối cùngtrong mảng:

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

Không những sử dụng jquery.

2

Object.keys(array)[0] trả về chỉ mục (ở dạng String) của phần tử đầu tiên trong mảng thưa thớt.

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

Tôi cũng đã phải đối mặt với một vấn đề tương tự và đã rất ngạc nhiên rằng không có ai đã xem xét những điều sau đây:

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

trên sẽ sản xuất

1245,31 
2045,45 

Nếu cần thiết bạn có thể tồn tại sau khi đầu tiên lặp lại nếu tất cả những gì được yêu cầu, nhưng nói chung chúng ta cần phải biết nơi trong mảng để bắt đầu.

1

Đây là đề xuất có phương pháp ES5 với Array#some.

Mã nhận phần tử không đầu tiên đầu tiên và chỉ mục. Lặp dừng lại ngay lập tức với trở true trong callback:

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

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

 
console.log(index, value);

-1

Bạn cũng có thể sử dụng tái sử dụng mã nguồn mở này array-first component mà trả về phần tử đầu tiên của một mảng nhất định.

Ví dụ:

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

Họ hỏi về một mảng ** thưa thớt **, không phải là mảng bình thường. – aleclarson

Các vấn đề liên quan