【问题标题】:How to write a forEachRight-function, that is working with objects?如何编写一个处理对象的 forEachRight 函数?
【发布时间】: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


【解决方案1】:

使用Object.entries() 获取键和值数组。然后您可以使用该数组递归调用自己。

forEachRight = function(list, callback) {
  if (Array.isArray(list)) {
    for (let i = list.length - 1; i > -1; i--)
      callback(list[i], i, list);
  } else {
    forEachRight(Object.entries(list), ([key, value], _, __) => 
      callback(value, key, list));
  }
};

forEachRight({
  a: 1,
  b: 2
}, (v, k) => console.log(k, v));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-29
    • 2021-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-23
    • 1970-01-01
    相关资源
    最近更新 更多