javascript - 将属性添加到 array.reduce() 返回对象的顺序

标签 javascript arrays object ecmascript-6

谁能解释一下为什么在不同的 array.reduce() 函数使用中最终输出是相同的?

在第一个示例中,直接对样本数组进行归约,而在第二个示例中,将样本数组先反转,然后再归约。

var array = [{
        "Id": "1",
        "Week": "2019-01-13"
    },
    {
        "Id": "2",
        "Week": "2019-01-20"
    },
    {
        "Id": "3",
        "Week": "2019-01-27"
    }
];

array.reduce(function (acc, curr) {
    acc[curr.Id] = curr.Week;
    console.log(acc);
    return acc;
}, {});

//Output
/*{ "1": "2019-01-13" }
{ "1": "2019-01-13", "2": "2019-01-20" }
{ "1": "2019-01-13", "2": "2019-01-20", "3": "2019-01-27" }*/

array.reverse().reduce(function (acc, curr) {
    acc[curr.Id] = curr.Week;
    console.log(acc);
    return acc;
}, {});
//Output 
/*{ "3": "2019-01-27" }
{ "2": "2019-01-20", "3": "2019-01-27" }
{ "1": "2019-01-13", "2": "2019-01-20", "3": "2019-01-27" }
*/

我希望输出显示为 {“3”:“2019-01-27”,“2”:“2019-01-20”,“1”:“2019-01-13”}。

如果我使用非数字键,两种情况下的reduce函数输出都符合预期(以相同的元素传递顺序)。

最佳答案

正如评论中已经提到的JS 中不保证对象属性顺序,这就是你得到该输出的原因。如果你想让顺序重要,你需要使用 Map作为您的减少累加器

The Map object holds key-value pairs and remembers the original insertion order of the keys.

话虽如此,这里有一些示例代码可以更好地说明它:

var array = [{ "Id": "1", "Week": "2019-01-13" }, { "Id": "2", "Week": "2019-01-20" }, { "Id": "3", "Week": "2019-01-27" } ];

let r1 = array.reduce(function(acc, curr) {
  acc.set(curr.Id, curr.Week);
  return acc;
}, new Map());

let r2 = array.reverse().reduce(function(acc, curr) {
  acc.set(curr.Id, curr.Week);
  return acc;
}, new Map());

console.log('r1:')
r1.forEach(x => console.log(x))

console.log('r2:')
r2.forEach(x => console.log(x))

console.log('fromEntries:')
console.log(Object.fromEntries(r1))
console.log(Object.fromEntries(r2))

请注意,当我们循环遍历两个映射 (r1r2) 的条目时,顺序有何不同。但还要注意,当您将映射转换为对象文字时,顺序现在是相同的,因为无法保证 JS prop 顺序。

关于javascript - 将属性添加到 array.reduce() 返回对象的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56230379/

相关文章:

javascript - 如何在页面加载时显示正在加载的 gif 图像

java - 将 PriorityQueue 转换为排序数组的最佳方法

C++模板数组大小推导

javascript - 使用 google API 和 javascript 的 PHP 项目 : Inherited Mess

javascript - 基于 rxjs 中的时间处理事件流

javascript - 单击时如何保留按钮周围的矩形边框

javascript - 选择 INTO 数组或对象

java - 如何从 xml 创建对象的 arrayList?

python - 如何构建一个基本的迭代器?

java - 方法中的数组修改