【发布时间】:2021-10-07 16:49:06
【问题描述】:
我有自己编写 forEachRight-Function 的练习: https://lodash.com/docs/4.17.15#forEachRight
当集合是一个数组时,这很容易。我只是以相反的顺序循环遍历它:
_.forEachRight = function(list, callback) {
if(Array.isArray(list)) {
for (let i = list.length - 1; i > -1; i--)
callback(list[i], i, list);
}
else {
}
}
但是如何解决它,如果集合是一个对象,会给我带来真正的大问题和小错误。
这是一个示例对象:
var brothers = {
Toby: 23,
Max: 24,
John: 25
}
我尝试用 unshift 解决它并将其添加到数组中:
_.forEachRight = function(list, callback) {
let reverseArray = []
if(Array.isArray(list)) {
for (let i = list.length - 1; i > -1; i--)
callback(list[i], i, list);
}
else {
for (var key in list)
{reverseArray.unshift(callback(list[key], key, list))}
}
console.log(reverseArray);
}
console.log 仅供我测试。
现在我可以使用 for 循环轻松地遍历 reverseArray。也可以通过属性循环:
_.forEachRight(brothers, function(value, name, list) {
return name;
})
或者通过按键:
_.forEachRight(brothers, function(value, name, list) {
return value;
})
但是:如果我在回调函数的返回中使用console.log(value) 或console.log(name):
_.forEachRight(brothers, function(value, name, list) {
return console.log(value);
})
它不再工作了。
输出:
23
24
25
[ undefined, undefined, undefined ]
然后我尝试使用unshift(list[key], key, list)“修复”循环。
但它总是将所有内容都转移到反向数组,而不仅仅是我在回调函数中返回的内容(这是合乎逻辑的)。
现在我被困住了,有点困惑图书馆是如何解决这个问题的?还是他们写了很多 if 语句来排除像return console.log 这样的特殊情况。这将是我最后的解决方案,但我想也许有更简单的解决方案?
【问题讨论】:
-
对不起,我不明白这个问题... 什么被破坏以及如何?你能展示一个可重现的例子吗?
-
reverseArray应该在这里做什么? AFAIK,在 forEach 中,回调的返回值被忽略(除非 lodash 为 forEachRight 做了一些特殊的事情)。 -
为什么要使用回调的返回值?为什么不先将值添加到反向数组,然后循环遍历并调用回调?
标签: javascript javascript-objects