【问题标题】:transform array to dynamic object将数组转换为动态对象
【发布时间】:2019-06-22 15:12:38
【问题描述】:

我想将下面的动态数组转换为动态对象

例如

让

array=[{"MyFirstValue":"1"},{MySecondvalue:"2"}]

我想把它转换成动态对象

喜欢

let newobject={MyFirstValue:"1",MySecondvalue:"2" }

这里的动态对象是根据数组中值的数量,新对象应该能够转换 例如

如果数组值发生变化 =

array=[{"MyFirstValue":"1"},{MySecondvalue:"2"},{MyThirdValue:"2"}]

newobject 应该转换为

newobject={MyFirstValue:"1",MySecondvalue:"2",MyThirdValue:"2" }

我尝试使用 array.map 并推送值但无法设置 key 属性

这就像将归约数组简化为一个对象。我不确定我是否可以使用 reduce。

【问题讨论】:

  • 你至少需要不同的键...?
  • 您需要不同的键或调用 let newobject={"1","2" }
  • 这个[{"key":"1"},{key:"2"}] 对象有什么问题?
  • 这是不可能的,除非你有不同的钥匙。使用key 在地图中的两个条目是冲突
  • 对你来说究竟什么是“动态对象”?

标签: javascript arrays typescript


【解决方案1】:

假设您的密钥是唯一的,您可以使用 Object.assign 完成此操作。

const array = [{"key1":"1"}, {"key2":"2"}];

const newObject = Object.assign({}, ...array);

console.log(newObject);

【讨论】:

  • 我正在使用 typescript 并收到此错误 Property 'assign' does not exist on type 'ObjectConstructor'。
  • 这里有一些关于如何处理这个问题的讨论:stackoverflow.com/questions/35959372/…
【解决方案2】:

您的对象中需要有唯一的键。此外,您应该不期望您的所有对象都具有 100% 的唯一键。与其拥有{key: 1, key: 2},不如让属性key 成为一个值数组; {key: [1, 2]}。我会使用Array.prototype.reduce 来实现这一点。

const array = [{"key":"1", other: 'FOO'},{key:"2", dynamic: 'BAR', other: 'BAZ'}]

const object = array.reduce((initial, value) => {
  Object.keys(value).forEach((key) => {
    if(initial[key]) initial[key].push(value[key])
    else initial[key] = [value[key]]
  })
  return initial;
}, {})

console.log(object)

【讨论】:

  • 西班牙语课加 1 :)
【解决方案3】:

试试

let newobject= array.reduce((x,y)=> ({...x,...y}), {});

let array=[{"MyFirstValue":"1"},{MySecondvalue:"2"}]

let newobject= array.reduce((x,y)=> ({...x,...y}), {});

console.log(newobject);

【讨论】:

  • 如果您的任何一个对象具有相同的键(第二个对象的值将覆盖第一个对象的值),这种方式将引入错误。假设两个对象都有完全唯一的键是个好主意吗?
  • @CoryKleiser Uno:第一个问题版本中的 OP 使用两个相同的密钥,但他更正了这一点并制作了唯一的密钥。 Secundo:OP 没有描述在键不唯一的情况下他期望什么样的结果(例如,如果他会对这种情况感兴趣,那么他想获得数组中非唯一键的最后一个值......)所以这个表示非唯一键大小写超出了 OP 问题的范围。
  • 好的,有道理;不过,我怀疑 OP 是否想根据数组中对象的顺序轻易丢弃值。西班牙语101课:西班牙语中的first是primero :)
【解决方案4】:

使用 ES5:

var input = [{"MyFirstValue":"1"},{MySecondvalue:"2"},{MyThirdValue:"2"}];

var output = Object.assign.apply({}, input);

console.log(output);

【讨论】:

    猜你喜欢
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    • 2016-08-02
    • 1970-01-01
    • 2021-05-03
    • 2018-12-04
    • 2021-06-16
    相关资源
    最近更新 更多