gpt4 book ai didi

javascript - 重写 Javascript 过滤器/forEach

转载 作者:行者123 更新时间:2023-11-29 18:08:28 25 4
gpt4 key购买 nike

Javascript 新手 - 我正在尝试重写 forEach 和过滤器以理解它们。我希望能够使用过滤器来传递类似 {"hello": 4, "world": 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}..

最佳答案

如果你想知道他们做什么,the spec is fairly clear并且可以很合理地转换为 JavaScript 代码(事实上,这已经是 done on MDN )。

你的和 JavaScript 的一些区别:

  1. JavaScript的forEachfilter 不要使用for-in,这是最基本的你的和 JavaScript 的区别。他们只使用对象和数组索引,期望对象是一个类数组(例如,有一个length 和带有“0”这样的键的属性"1" 等等 [是的,所有键都是字符串,甚至是标准数组中的键,它们根本不是真正的数组)。

  2. JavaScript 的版本不会为不存在的条目调用回调(例如,在稀疏数组的情况下)。要将其添加到您的,您需要在某个阶段添加 hasOwnProperty(index)

  3. JavaScript 版本将更多参数传递给回调。

  4. JavaScript 的版本允许您在调用回调时指定一个值作为 this 使用。

  5. JavaScript 的版本在开始前抓取长度,因此如果集合被修改,则使用旧长度。根据更改的位置,可能会跳过条目。

例如,您对 forEach 的看法可能看起来更像这样:

function myForEach(collection, callback, thisArg) {
var l = +collection.length;
for (var i = 0; i < l; i++) {
if (collection.hasOwnProperty(i)) {
callback.call(thisArg, collection[i], i, collection);
}
}
}

同样,这不是(远程)规范中算法的准确实现,只是对您的算法稍作修改以解决我在上面提出的具体问题。

关于javascript - 重写 Javascript 过滤器/forEach,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29604121/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com