2015-05-11 67 views
0

我有這個簡單的數組使用Javascript - 通過值刪除陣列的項目,如

var array = ['x.89999', 'y.sisisis', 'x.585858']; 

我想刪除通過啓動陣列中的所有項目「X」。所以要返回這個數組:

['y.sisisis'] 

我該怎麼做,而不必循環或迭代所有整個數組? (我知道這可能是不可能的所以不介意,如果不可能的話)

是否有一些內置/本機代碼,我可以使用?

感謝

+2

您可以使用'.filter()',但它仍然在內部循環。 – Scimonster

+0

使用正則表達式是顯而易見的,也許是唯一的答案,但是你必須遍歷數組中的元素來做到這一點。或者使用'.filter',但是它也會遍歷數組。 –

+0

如果確保列表總是已排序,則只需迭代它,直到遇到不以x開頭的第一個字符串。 –

回答

6

您可以使用array.filter()

var newArray = array.filter(function(item){ 
    return item.indexOf('x.') !== 1; 
}); 

沒有辦法做這個工作,而無需通過整個數組循環。 唯一的情況 - 數組按字母順序排序。但分揀需求循環通過太

+0

這會遍歷整個集合。 –

+2

嘿,閱讀下面的代碼文本,我提到那 –

+0

它仍然不正確。根據數據來自何處以及數據是否隨後添加,您不必遍歷所有內容。 –

2

假設刪除的項目將總是按字母順序先於其他項目(即xy之前),您可以排序的數組,然後儘快打破環路非x值已經發現:

function filter(arr) { 
    arr.sort(); 
    for (var i = 0, l = arr.length; i < l; i++) { 
     if (arr[i][0] !== 'x') { 
      break; 
     } 
    } 
    return arr.slice(i); 
} 

filter(arr); // logs: "Iterated to 5 of array length 9" 

DEMO

當然,作爲JazzCat提到,這是沒有好,如果你只有一個y值,並將其在數組的結尾是正確的 - 你還在將不得不迭代整個數組。

+0

cooool很多cooool ................ – sbaaaang

1

備用選項是使用正則表達式,就像這樣。根據您的要求修正您的正則表達式。不使用顯式迭代或Array.prototype.filter

var array = ['x.89999', 'y.sisisis', 'x.585858']; 

var filtArr = array.filter(function(x){ 
    return x.match("^[x].+$"); 
}); 

console.log(filtArr); 
1

一個不同的答案:

var array = ['x.89999', 'y.sisisis', 'x.585858']; 
array = array.join("#").replace(/(#?x\.\w*)/g,"").replace(/^#/,"").split("#"); 
//["y.sisisis"] 

當然,你將需要採取的分隔符的照顧。

好的一點是,它可以在舊的瀏覽器(ie8)上工作,而Array.prototype.filter不會。