【问题标题】:spread operator converting objects to array扩展运算符将对象转换为数组
【发布时间】:2017-12-30 07:26:20
【问题描述】:

我正在尝试转换这样的数据结构:

data = { 
  0:{A:a}, 
  1:{B:b}, 
  2:{C:c}, 
}

变成这样的结构:

[
 {0:{A:a}},
 {1:{B:b}}, 
 {2:{C:c}},
]

像这样使用扩展运算符:[...data] 返回任何空数组。

我也试过[{...data}]

有没有办法使用扩展运算符来获得所需的结果?另外,为什么这种方法不起作用?

【问题讨论】:

  • 数字键与数组的索引有关吗?

标签: javascript arrays object ecmascript-6 spread-syntax


【解决方案1】:

“有没有办法使用扩展运算符来获得所需的结果?” 简短的回答,没有。 (有关您要完成的任务的替代解决方案,请参见下文)

“另外,为什么这种方法不起作用?”

它不起作用,因为根据MDN docs

“ECMAScript 提案的 Rest/Spread 属性(第 3 阶段)将扩展属性添加到对象字面量。它将自己的可枚举属性从提供的对象复制到新对象。”

就像文档说的那样,根据“Rest/Spread Properties 提议”,您不能将对象属性传播到数组上,对象总是会将它们的属性传播到新对象上。同样,数组不会传播到一个对象上,它们只会传播到一个新的数组上。

替代解决方案:

您可以使用Object.keys().map() 轻松完成此操作。 Object.keys() 将获得对象键的数组,Array.map() 将它们映射到所需结构的数组中,如下所示:

var data = { 
  0:{A:"a"}, 
  1:{B:"b"}, 
  2:{C:"c"}, 
}

var result = Object.keys(data).map(function (key) {
   return { [key]: data[key] };
});
console.log(result);

【讨论】:

  • 这不是正在发生的事情,也不是正确答案
  • 您的回答字面上是正确的,但它没有解释 OP 提出的任何问题。他在询问为什么价差操作员不起作用。如果您能在回答中解释这一点,我会将您的回答改为正确。
  • @ChristianMatthew “为什么这段代码不起作用?”不是一个主题问题。真正的问题是“有没有办法使用扩展运算符来获得所需的结果?”答案是响亮的“不”。为了更有帮助,每个人都提供了替代解决方案来实现相同的目标。但是,我确实超越并解决了“为什么传播运算符在这种情况下不起作用?”。 OP 正试图将对象传播到 array 上,而文档(我引用的)明确指出对象传播到 new object 而不是数组上。不确定您还在寻找什么?
  • 我选择了你的,因为它被标记为正确,这增加了混乱,这在某种程度上是对 OP 所要求的正确回应。也许 OP 的问题实际上是我该如何做到这一点,并且您的答案再次正确,但随后他的帖子需要编辑以反映这一点。无论哪种方式,我都在回答这个问题时发现了 OP 提出的问题以及人们如何尝试回答这些问题。它没有提供信息,它可能是
  • 这很公平,我会确保下次这样做。感谢您的编辑。
【解决方案2】:

您可以使用Object.entries 获取[key, value] 对,并使用computed property names 将它们映射到对象数组:

const data = { 
  0:{A: 'a'}, 
  1:{B: 'b'}, 
  2:{C: 'c'}
};

const result = Object.entries(data).map(([key, value]) => ({ [key]: value }));

console.log(result);

【讨论】:

    【解决方案3】:

    恐怕您不能像示例中那样使用传播运算符,但是您可以使用 reduce 生成所需的输出。

    data = { 
      0:{A:'a'}, 
      1:{B:'b'}, 
      2:{C:'c'}, 
    }
    
    let resArr = Object.keys(data).reduce((arr, e) => {
      arr.push({[e]: data[e]});
      return arr;
    }, []);
    
    console.log(resArr);

    【讨论】:

    • 这为每个对象提供了文字属性“e”。您需要使用括号语法动态添加属性以获得正确的属性名称 - arr.push({ [e]: data[e] });
    猜你喜欢
    • 1970-01-01
    • 2017-03-17
    • 2017-06-11
    • 2019-09-11
    • 1970-01-01
    • 2019-09-01
    • 2021-04-09
    • 1970-01-01
    • 2022-01-01
    相关资源
    最近更新 更多