将javascript中的数组更改为更简单的对象
我有一个简单的JSON,带有一个包含更多对象的数组,如下所示:将javascript中的数组更改为更简单的对象,javascript,arrays,Javascript,Arrays,我有一个简单的JSON,带有一个包含更多对象的数组,如下所示: languagePack: [ { 'key': 'Username', 'value': 'Benutzername', 'group': 'default' }, { 'key': 'Password', 'value': 'Passwort', 'group': 'default' } ] languagePack: { 'Username': 'Be
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)
您可以使用ES6Map
来使用对象。从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,这里你可以比较一下这个特定的代码: