将javascript中的数组更改为更简单的对象

Mar*_*ger 13 javascript arrays

我有一个简单的JSON,其中包含一个包含其他对象等的数组,如下所示:

languagePack:
[
  {
    'key': 'Username',
    'value': 'Benutzername',
    'group': 'default'
  },
  {
    'key': 'Password',
    'value': 'Passwort',
    'group': 'default'
  }
]
Run Code Online (Sandbox Code Playgroud)

但是我真正想要的是这样的对象:

languagePack: 
{
    'Username': 'Benutzername',
    'Password': 'Passwort'
}
Run Code Online (Sandbox Code Playgroud)

因此,我想将数组简化为数组甚至对象内部的简单键值对(键是唯一的)。有谁知道如何通过一些很棒的数组函数来减少这种情况?我只为每个对象想出了一个类似的东西,并为属性建立了“手工”对象的属性,但我记得数组中有一些很棒的东西,例如“ reduce”,散布运算符(...),map,一些,等等

我尝试了类似的东西:

var temp = this.languagePack.map(([key, value]) => ({key,value}))
console.log(temp)
Run Code Online (Sandbox Code Playgroud)

但这只会给我一条错误消息 TypeError: Invalid attempt to destructure non-iterable instance

编辑:所有三个答案都工作正常。谢谢。

Max*_*rou 10

您可以使用javascript reduce函数创建一个空对象,并将每个键和值放入其中。

const data = [
  {
    'key': 'Username',
    'value': 'Benutzername',
    'group': 'default'
  },
  {
    'key': 'Password',
    'value': 'Passwort',
    'group': 'default'
  }
];

const newData = data.reduce((acc, row) => {
  acc[row.key] = row.value;
  return acc;
}, {});

console.log(newData);
Run Code Online (Sandbox Code Playgroud)

编辑:Donny Verduijn的好建议。您可以使用es6解构来缩短函数的编写时间。

const newData = data.reduce((acc, { key, value }) => ({ ...acc, [key]: value }), {});
Run Code Online (Sandbox Code Playgroud)

  • 出于好奇。前一段时间,我正在测试散布运算符对对象进行结构分解的性能,即使确实确实有时可以提高代码的可读性,它的代价也很高:https://www.measurethat.net/Benchmarks/显示/ 6194/5 /比较数组中的传播算子和concat (3认同)
  • 如果您想使用ES6语法,还可以通过({acc,{key,value}} =>({... acc,[key]:value})来实现reduce函数。 (2认同)

ma_*_*_15 9

基本上,您需要使用forEach而不是map函数,然后可以将该对象构建为要保留的任何键,值对。

试试这个,它将解决您的问题。

var temp = {};

this.languagePack.forEach(({key,value}) => {
    temp[key] = value
})

console.log(temp)
Run Code Online (Sandbox Code Playgroud)

注意:这里我们不使用,map因为我们要返回对象而不是数组,因此,我们可以reduce在这里使用函数来这样做,但是我认为这很容易理解我们想要的东西以及我们在这里做什么。


pra*_*nth 5

Array#map它一起使用创建键和值作为对象,并将Object.assign隐式数组的值作为对象

const languagePack = [ { 'key': 'Username', 'value': 'Benutzername', 'group': 'default' }, { 'key': 'Password', 'value': 'Passwort', 'group': 'default' } ];

var res = Object.assign({},...languagePack.map(({key,value}) => ({[key]:value})))

console.log(res)
Run Code Online (Sandbox Code Playgroud)