Sci*_*ter 7 javascript arrays filter
我有一个数组,我想过滤它只包含符合特定条件的项目.可以用JavaScript完成吗?
一些例子:
[1, 2, 3, 4, 5, 6, 7, 8] // I only want [2, 4, 6, 8], i.e. the even numbers
["This", "is", "an", "array", "with", "several", "strings", "making", "up", "a", "sentence."] // I only want words with 2 or fewer letters: ["is", "an", "up", "a"]
[true, false, 4, 0, "abc", "", "0"] // Only keep truthy values: [true, 4, "abc", "0"]
Run Code Online (Sandbox Code Playgroud)
Sci*_*ter 20
为此,您可以使用Array#filter()ECMAScript5中引入的方法.除了IE8和更低版本以及Firefox的古老版本之外,所有浏览器都支持它.如果由于某种原因,您需要支持这些浏览器,则可以使用polyfill作为方法.
filter()将函数作为其第一个参数.对于数组的每个项,您的函数都传递三个参数 - 当前项的值,它在数组中的索引以及数组本身.如果你的函数返回true(或truthy值,例如1,"pizza"或42),该项目将包括在结果中.否则,它不会.filter()返回一个新数组 - 原始数组将保持不变.这意味着您需要在某处保存值,否则它将丢失.
现在,在问题的例子中:
var myNumbersArray = [1, 2, 3, 4, 5, 6, 7, 8];
console.log(myNumbersArray.filter(function(num){
return !(num % 2); // keep numbers divisible by 2
}));
console.log(myNumbersArray); // see - it hasn't changed!
var myStringArray = ["This", "is", "an", "array", "with", "several", "strings", "making", "up", "a", "sentence."];
console.log(myStringArray.filter(function(str){
return str.length < 3; // keep strings with length < 3
}));
console.log(myStringArray);
var myBoolArray = [true, false, 4, 0, "abc", "", "0"];
console.log(myBoolArray.filter(Boolean));
// wow, look at that trick!
console.log(myBoolArray);Run Code Online (Sandbox Code Playgroud)
为了完整起见,还有一个使用索引和数组参数的示例:从数组中删除重复项:
var myArray = [1,1,2,3,4,5,6,1,2,8,2,5,2,52,48,123,43,52];
console.log(myArray.filter(function(value, index, array) {
return array.indexOf(value) === index;
}));Run Code Online (Sandbox Code Playgroud)
要过滤不是严格数组的条目,因此.filter在它们的原型上没有属性,但仍然是可迭代的(如document.getElementsByTagName),你可以使用
Array.prototype.filter.call(collection, function filterFunction(el, index, collection) {
...
});
Run Code Online (Sandbox Code Playgroud)
或速记
[].filter.call(collection, function filterFunction(el, index, collection) {
...
});
Run Code Online (Sandbox Code Playgroud)
对于不可迭代的对象,但您仍希望过滤属性并获取通过过滤的键数组,您可以Object.keys像这样组合:
var obj = { one: 1, two: 2, three: 3, four: 4 };
var filtered = Object.keys(obj).filter(function(key) {
return obj[key] % 2 === 0;
}); //filtered == ['two', 'four']
Run Code Online (Sandbox Code Playgroud)
然后,您可以创建包含这些属性的新对象:
var filteredObj = filtered.reduce(function(newObj, currentKey) {
newObj[currentKey] = obj[currentKey]; //Add the original value to the new object
return newObj; //Return the new object to continue iteration
}, {}) // Begin iteration with a blank object
//filteredObj is now { two: 2, four: 4 }
Run Code Online (Sandbox Code Playgroud)
以上甚至可以组合成一个功能!
function filterObject(obj, testCallback) {
return Object.keys(obj).filter(function(key, index, array) {
return testCallback(obj[key], index, array); //Call original filter but pass the property
}).reduce(function(newObj, currentKey) {
newObj[currentKey] = obj[currentKey]; //Add the original value to the new object
return newObj; //Return the new object to continue iteration
}, {}); // Begin iteration with a blank object
}
Run Code Online (Sandbox Code Playgroud)
并使用这样的:
var obj = { one: 1, two: 2, three: 3, four: 4 };
var filteredObj = filterObject(obj, function(el) { return el % 2 === 0 });
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
22535 次 |
| 最近记录: |