2015-05-11 108 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不会。