Javascript新手 - 我试图重写forEach并过滤以理解它们。我希望能够使用过滤器传递类似{"你好":4,"世界":2," hi":1}并能够根据数字进行过滤。
这是我的forEach:
function myForEach(collection, callback) {
if (Array.isArray(collection)) {
for (var i = 0; i < collection.length; i++) {
callback(collection[i]);
}
}
else {
for (var key in collection) {
callback(collection[key]);
}
}
}
这里有过滤器:
function filterWithForEach (collection, predicate) {
if (Array.isArray(collection)) {
var newArray = [];
myForEach(collection, function (element) {
if (predicate(element)) {
newArray.push(element);
}
});
return newArray;
}
else {
var newCollection = {};
myForEach(collection, function (element) {
if (predicate(element)) {
newCollection[element] = element; //here's where I think it's wrong
}
});
return newCollection;
}
}
我知道问题在于我如何分配它们,因为当我测试它时,我得到了这些输出:
console.log(filterWithForEach([1,2,3,4,5], function(num) {
return num > 2;
})); // works fine
console.log(filterWithForEach(aList, function(item) {
return item > 3;
})); // provides {4: 4}..
答案 0 :(得分:1)
如果您正在寻找要返回的对象,那么就应该这样。
function myForEach(collection, callback) {
if (Array.isArray(collection)) {
for (var i = 0; i < collection.length; i++) {
callback(collection[i]);
}
}
else {
for (var key in collection) {
callback(collection[key], key);
}
}
}
这里有过滤器:
function filterWithForEach (collection, predicate) {
if (Array.isArray(collection)) {
var newArray = [];
myForEach(collection, function (element) {
if (predicate(element)) {
newArray.push(element);
}
});
return newArray;
}
else {
var newCollection = {};
myForEach(collection, function (element,key) {
if (predicate(element)) {
newCollection[key] = element; }
});
return newCollection;
}
}
答案 1 :(得分:0)
您可以在Array原型函数中创建一个过滤器自己的方法。如果您正在寻找其他方法,则可以使用迭代器和类似的递归函数:
Array.prototype.megaFilter = function(cb) {
const iterator = this[Symbol.iterator]();
const iteration = iterator.next();
const filteredArray = [];
iterate(iteration);
function iterate(iteration) {
if (iteration.done) return iteration;
if (cb(iteration.value)) filteredArray.push(iteration.value);
const nextIteration = iterator.next(iteration.value);
return iterate(nextIteration);
}
return filteredArray;
};
const array = [1, 2, 3, 4, 5, 6, 7];
console.log(array.megaFilter(v => v % 2 === 0));
要点在这里,非常欢迎您给我反馈: https://gist.github.com/jdtorregrosas/d69f67e8079f82fbc2a5904e76a8fb6c