在JavaScript中更改对象的结构
我有一些数据在JavaScript中更改对象的结构,javascript,arrays,ecmascript-6,Javascript,Arrays,Ecmascript 6,我有一些数据 arr = { 'a': ['1', '2', '3'], 'b': ['2', '3', '4'], 'c': ['3', '5', '6'], } 我怎样才能把这个改成 newArr = { '1': ['a'], '2': ['a', 'b'], '3': ['a', 'b', 'c'], '4': ['b'], '5': ['c'], '6': ['c'] } 这样做最有效的方法是什么 const newData = {}; Obje
arr = {
'a': ['1', '2', '3'],
'b': ['2', '3', '4'],
'c': ['3', '5', '6'],
}
我怎样才能把这个改成
newArr = {
'1': ['a'],
'2': ['a', 'b'],
'3': ['a', 'b', 'c'],
'4': ['b'],
'5': ['c'],
'6': ['c']
}
这样做最有效的方法是什么
const newData = {};
Object.keys(oldData).forEach(key => {
newData[key].forEach(value => {
if (!newData[value]) {
newData[value] = [];
}
newData[value].push(key);
});
});
使用ES6不是很容易吗,也许可以使用reduce()
?您可以使用reduce()
和一个forEach()
,如下所示
var-arr={
'a':['1','2','3'],
'b':['2','3','4'],
'c':['3','5','6'],
}
var result=Object.keys(arr).reduce(函数(r,e){
arr[e].forEach(函数(a){
如果(!r[a])r[a]=[];
r[a]。推(e)
})
返回r;
}, {});
console.log(result)
您可以像这样使用reduce()
和一个forEach()
var-arr={
'a':['1','2','3'],
'b':['2','3','4'],
'c':['3','5','6'],
}
var result=Object.keys(arr).reduce(函数(r,e){
arr[e].forEach(函数(a){
如果(!r[a])r[a]=[];
r[a]。推(e)
})
返回r;
}, {});
console.log(结果)
只需更改一行即可
newData[key].forEach(value => {
到
var oldData={
'a':['1','2','3'],
'b':['2','3','4'],
'c':['3','5','6'],
};
const newData={};
Object.keys(oldData).forEach(key=>{
oldData[key].forEach(值=>{
//^^^^^^更改为旧数据而不是新数据
如果(!newData[value]){
新数据[值]=[];
}
newData[值]。推送(键);
});
});
console.log(newData)代码>只需更改一行即可
newData[key].forEach(value => {
到
var oldData={
'a':['1','2','3'],
'b':['2','3','4'],
'c':['3','5','6'],
};
const newData={};
Object.keys(oldData).forEach(key=>{
oldData[key].forEach(值=>{
//^^^^^^更改为旧数据而不是新数据
如果(!newData[value]){
新数据[值]=[];
}
newData[值]。推送(键);
});
});
console.log(newData)
如果你愿意为此添加一个库,它有很多用于操作对象和数组的实用函数——可能是在后台优化的。你需要oldData[key]。forEach(…)
而不是newData[key]。forEach(…)
,但除此之外,它还可以。你需要reduce
而不是[…新的集合(Object.keys(arr).reduce((a,b)=>[
,但除此之外没关系。你需要reduce
而不是[…新的集合(Object.keys(arr).reduce((a,b)=>[…a,…arr[b]],[]);
为什么要使用reduce
而不是forEach
?为什么不呢,也是OP要求的。这是一行什么
您已更改了我的代码forever@NenadVracar那你为什么不把内部的forEach
也换成reduce
呢?@synthet1c这是个坏主意。concat
创建了新的数组。为什么要用reduce
而不是forEach
?为什么不呢,也是OP要求的。多好的一行r[a]=(r[a]|[])。concat(e)
您已更改了我的代码forever@NenadVracar那么,为什么不将内部的forEach
也替换为reduce
?@synthet1c这是个坏主意。concat
创建了新的数组。