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_Ecmascript 6 - Fatal编程技术网

在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
创建了新的数组。