首页 > 解决方案 > 打字稿:合并由 Object.defineProperty 创建的对象

问题描述

我有一个这样的数组:

let aa = [
    Object.defineProperty({alignedType: "t"}, "f1", {value: 1}),
    Object.defineProperty({alignedType: "t"}, "f2", {value: 2}),
    Object.defineProperty({alignedType: "t"}, "f3", {value: 3}),
    Object.defineProperty({alignedType: "t"}, "f4", {value: 4})
];

我需要将此数组简化为一个简单的对象,例如:

let yyy = aa.reduce((acc, e) => {
    return {...acc, ...e};
});

我正在运行yyy的对象仅包含一个对象,其中仅包含alignedType: "t". 它没有更多的属性。

在这里你有调试器:

在此处输入图像描述

我期待的对象是:{alignedType: "t", f1: 1, f2: 2, f3: 3, f4: 4}.

有任何想法吗?

标签: javascript

解决方案


您需要设置{ enumerable: true }说在枚举相应对象的属性期间显示此属性:

let aa = [
  Object.defineProperty({ alignedType: 't' }, 'f1', { value: 1, enumerable: true }),
  Object.defineProperty({ alignedType: 't' }, 'f2', { value: 1, enumerable: true }),
  Object.defineProperty({ alignedType: 't' }, 'f3', { value: 1, enumerable: true }),
  Object.defineProperty({ alignedType: 't' }, 'f4', { value: 1, enumerable: true }),
];


let yyy = aa.reduce((acc, e) => {
  return {...acc, ...e};
});

console.log(yyy);

请参阅developer.mozilla.org上的 enumerable

更新

来自https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax

ECMAScript 提案的 Rest/Spread Properties(第 4 阶段)将扩展属性添加到对象文字。它将自己的可枚举属性从提供的对象复制到新对象上。


推荐阅读