开发者问题收集

过滤一个数组以创建另一个数组的最佳方法是什么?

2012-01-29
171

我想根据字符串过滤数组中的项目,并将它们保存到新数组中,然后对第二个数组执行其他一些函数。我该如何最好地实现这一点?

这是我目前所拥有的。

for (var i = 0; i < array.length; i++) {
    var num = i;
    var item = array.entries[i];
    var str = item.content;    
    var newArray = new Array();

    if (str.indexOf("filter") !== -1) {
                // If the content of the item contains a given string then ad it to the array.
                newArray.push(item);

        if (num === array.length) {
            // When we reach the end of the first array, perform something on the new array.
            doSomeFunction();
        }
    }

    function doSomeFunction() {
        // Now do something with the new array
        for (var j = 0; j < newArray.length; j++) {
            // Blah, blah, blah...
        }
    }
}

感谢您的帮助。

2个回答

ECMAScript 5 支持数组上的 filter 方法。

例如:

> [1,2,3,4].filter(function(v) { return v % 2 == 0})
[ 2, 4 ]

您可以参考 MDN 的文档 查看用法。

但请注意,有些浏览器不支持此功能,出于兼容性问题,您可以考虑使用 es5-shim underscore

在您处理字符串数组的情况下。您可以将 filtermap 一起使用。>

例如,过滤所有以“index”开头的字符串,然后从中取出尾随数字。

var ss = [
  "index1",
  "index2",
  "index3",
  "foo4",
  "bar5",
  "index6"
];

var nums = ss.filter(function(s) {
  return /^index/.test(s);
}).map(function(s) {
  return parseInt(s.match(/(\d+)$/)[1], 10);
});

console.log(nums);

上述脚本为您提供 [1,2,3,6]

qiao
2012-01-29

类似这样:

function arrayFromArray(a,f){
  var b=[];
  for (var x=0;x<a.length;x++) {
    if (f(a[x])) {
      b.push(a[x]);
    }
  }
  return b;
}


function predicateIsEven(i){
  return i%2==0;
}


var arr=[1,2,3,4,5,6];

var evens=arrayFromArray(arr,predicateIsEven);
Mark Robbins
2012-01-29