Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将javascript中的数组更改为更简单的对象_Javascript_Arrays - Fatal编程技术网

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

将javascript中的数组更改为更简单的对象,javascript,arrays,Javascript,Arrays,我有一个简单的JSON,带有一个包含更多对象的数组,如下所示: languagePack: [ { 'key': 'Username', 'value': 'Benutzername', 'group': 'default' }, { 'key': 'Password', 'value': 'Passwort', 'group': 'default' } ] languagePack: { 'Username': 'Be

我有一个简单的JSON,带有一个包含更多对象的数组,如下所示:

languagePack:
[
  {
    'key': 'Username',
    'value': 'Benutzername',
    'group': 'default'
  },
  {
    'key': 'Password',
    'value': 'Passwort',
    'group': 'default'
  }
]
languagePack: 
{
    'Username': 'Benutzername',
    'Password': 'Passwort'
}
但我真正想要的是这样一个物体:

languagePack:
[
  {
    'key': 'Username',
    'value': 'Benutzername',
    'group': 'default'
  },
  {
    'key': 'Password',
    'value': 'Passwort',
    'group': 'default'
  }
]
languagePack: 
{
    'Username': 'Benutzername',
    'Password': 'Passwort'
}
因此,我想将数组简化为数组甚至对象内部的简单键值对(键是唯一的)。有没有人知道如何使用这些酷炫的数组函数来减少这种情况?我只想到了一些类似于for-each和为属性“手动”构建对象属性的东西,但我记得对于数组有一些很酷的东西,比如“reduce”、扩展操作符(…)、map、every、some等等

我试过这样的方法:

var temp = this.languagePack.map(([key, value]) => ({key,value}))
console.log(temp)
但这只给了我一条错误消息
TypeError:Invalid destructure non-iterable instance


编辑:这三个答案都很好。谢谢。

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

const数据=[
{
'键':'用户名',
'value':'Benutzername',
“组”:“默认值”
},
{
“密钥”:“密码”,
'value':'Passwort',
“组”:“默认值”
}
];
const newData=data.reduce((acc,row)=>{
acc[行键]=行值;
返回acc;
}, {});

console.log(newData)
基本上,您需要使用
forEach
而不是
map
函数,然后您可以将该对象构建为您想要保留的任何键、值对

试试这个,它会解决你的问题。

var temp = {};

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

console.log(temp)
注意:这里我们不使用
map
,因为我们希望返回的对象不是数组,所以我们可以在这里使用
reduce
函数,但我认为这很简单,也很容易理解我们想要什么以及我们在这里做什么。

数组一起使用#map
它将键和值创建为object和
object。将
隐蔽数组值分配给object

const languagePack=[{'key':'Username','value':'Benutzername','group':'default'},{'key':'Password','value':'Passwort','group':'default'}];
var res=Object.assign({}

console.log(res)
您可以使用ES6
Map
来使用
对象。从entries
映射
转换回
对象

有关

let languagePack=
[{
'键':'用户名',
'value':'Benutzername',
“组”:“默认值”
},
{
“密钥”:“密码”,
'value':'Passwort',
“组”:“默认值”
}];
设map=newmap();
languagePack.forEach((val)=>{
map.set(val.key,val.value);
})
languagePack=Object.fromEntries(映射);

console.log(languagePack)
应忽略
的可能重复项?是的,可以忽略该组,这只是我的同事的想法,即在不同的屏幕上使用相同的键并进行不同的翻译,但我找不到它的任何实际用途。但是这是后面要讨论的另一个问题:)如果您喜欢使用ES6语法,您也可以通过以下方式实现reduce函数:
(acc,{key,value})=>({…acc,[key]:value})
此外,您可以使用逗号操作符避免返回:
constnewdata=data.reduce((acc,row)=>(acc[row.key]=row.value,acc),{})只是好奇而已。前一段时间,我正在测试spread操作符对对象进行分解的性能,即使有时确实可以提高代码的可读性,但成本很高:@ElChiniNet您链接的测试用例是关于数组扩展,而不是对象扩展。(是的,反复传播到一个新对象要比变异单个对象慢得多)@Bergi,这里你可以比较一下这个特定的代码: