Новое в Javascript - Я пытаюсь переписать forEach и фильтровать, чтобы понять их. Я хотел бы иметь возможность использовать фильтр, чтобы передать что-то вроде {«hello»: 4, «world»: 2, «hi»: 1} и иметь возможность фильтровать по числу.Перезапись Фильтр Javascript/forEach
Вот мой 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}..
Почему вы все коллекции в объекте, в фильтре? 'filter' должен возвращать массив. – thefourtheye
Ни JavaScript 'forEach', ни' filter' не делает то, что вы делаете в случае объекта, который не является массивом (и не ограничивает себя массивами, просто вещи, которые похожи на массив *). Если вы хотите точно знать, что они делают, [spec достаточно ясен] (http://www.ecma-international.org/ecma-262/5.1/#sec-15.4.4.18). Части ваших функций, которые обрабатывают массивы, являются разумно нацеленными, хотя есть несколько деталей, которые немного отличаются друг от друга. Вероятно, самое существенное различие заключается в том, что версия JavaScript не вызывает обратный вызов для записей, которые не существуют. –
Вы хотите только знать значение или вам нужно знать ключ тоже? – Kushal