javascript - 映射对象键值的替代方法

标签 javascript

在不使用 forEach 的情况下通过对象键值映射的替代/最佳方法是什么?

这是我目前拥有的:

sortObject(source) {
    const object = Object.assign({}, source);

    Object.keys(object).forEach(key => {
      // Sort array by priority (the higher the number, the higher the priority)
      object[key] = object[key].sort((a, b) => b.priority - a.priority);

      // Limit the array length to the 5
      if (object[key].length > 5) {
        object[key] = object[key].slice(0, 5);
      }
    });

    return object;
}

source 是一个像这样的对象:

{
  base: [
    { id: 1, priority: 5 },
    { id: 2, priority: 10 },
    { id: 3, priority: 1 },
    { id: 4, priority: 5 },
    { id: 5, priority: 15 }
  ],
  extra: [
    { id: 1, priority: 1 },
    { id: 2, priority: 5 },
    { id: 3, priority: 10 }
  ],
  additional: [
    { id: 1, priority: 5 },
    { id: 2, priority: 10 },
    { id: 3, priority: 10 },
    { id: 4, priority: 15 },
    { id: 5, priority: 1 },
    { id: 6, priority: 29 },
    { id: 7, priority: 100 },
    { id: 8, priority: 100 },
    { id: 9, priority: 5 }
  ]
}

最终输出如下:

{
  base: [
    { id: 5, priority: 15 },
    { id: 2, priority: 10 },
    { id: 1, priority: 5 },
    { id: 4, priority: 5 },
    { id: 3, priority: 1 }
  ],
  extra: [
    { id: 3, priority: 10 },
    { id: 2, priority: 5 },
    { id: 1, priority: 1 }
  ],
  additional: [
    { id: 7, priority: 100 },
    { id: 8, priority: 100 },
    { id: 6, priority: 29 },
    { id: 4, priority: 15 },
    { id: 2, priority: 10 }
  ]
}

是否有更好/更清洁的方法来做到这一点?

最佳答案

我会看看 Object.entries (自 ES2017 起新增,但可填充)并在 for-of 循环中解构。

如果没有其他任何东西可以访问 source 上的数组(我倾向于假设,因为 sort 就地工作,所以code 已经修改了原始数组;但与此同时,source 是从外部传入的,所以...):

sortObject(source) {
    const object = Object.assign({}, source);

    for (const [key, array] of Object.entries(object)) {
        array.sort((a, b) => b.priority - a.priority);
        array.length = Math.min(array.length, 5);
    }

    return object;
}

如果其他东西可以访问这些数组并且除了对它们进行排序之外你不应该修改它们,那么你将需要你的原始 length 检查和 slice:

sortObject(source) {
    const object = Object.assign({}, source);

    for (const [key, array] of Object.entries(object)) {
        array.sort((a, b) => b.priority - a.priority);
        if (array.length > 5) {
            object[key] = array.slice(0, 5);
        }
    }

    return object;
}

您的代码表明您可能没有意识到 sort 就地工作,因为您将结果分配回原始位置。如果是这样,并且您不打算就地对数组进行排序,则需要在排序之前复制数组:

sortObject(source) {
    const object = Object.assign({}, source);

    for (const [key, array] of Object.entries(object)) {
        object[key] = array = array.slice();
        array.sort((a, b) => b.priority - a.priority);
        array.length = Math.min(array.length, 5);
    }

    return object;
}

你可以替换

        object[key] = array = array.slice();
        array.sort((a, b) => b.priority - a.priority);

        object[key] = array = Array.from(array).sort((a, b) => b.priority - a.priority);

如果您愿意,那将使用一个迭代器,它比 slice 开销更大。

关于javascript - 映射对象键值的替代方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52755502/

相关文章:

javascript - jQuery Gallery - Webkit 问题

javascript - Object.create 将prototype.constructor 更改为父构造函数,但在子实例化时,子构造函数运行

javascript - 无法让 Video.js 插件工作

javascript - 如何在 Window.Blur () 事件上创建事件监听器?

javascript - Angular 2 使用现有提供者

javascript - 在 JavaScriptCore 中加载 AMD 模块

javascript - 对象作为 JS Map 数据类型中的键的实际用途是什么?

javascript - 使用 JavaScript 跟踪值

JavaScript 检测用户是否离线

javascript - 使用接下来 4 个月中星期六的日期创建一个选择