Javascript - 平面图的解决方法
Javascript - Workaround for flatmap
所以我一直在寻找平面地图的一些解决方法,因为它在 IE 上不起作用,我找到了这个:
但我真的不明白为什么它有效
var gadjets = [
{computers:['asus', 'hp'],
sellphones:['Galaxy', 'Nokia']
},
{computers:['dell', 'insys'],
sellphones:['iphone', 'samsung']
}
];
const getValues = gadjets.reduce((acc, gadjet) => acc.concat(gadjet[computers]), []) // instead of gadjets.flatMap(gadjet=> gadjet[computers])
此代码 returns:
['asus','hp','dell','insys']
但不应该 return:
['asus','hp'],['dell', 'insys']
这是因为reduce
把你给它的元素加起来了。例如,采用以下代码:
let arr = [1,2,3,4,5];
console.log(arr.reduce((before, value)=>before+value));
此代码获取每个 value
并将其添加到 before
。然后它将添加的值传递到 before
变量中 reduce
的下一次迭代。
在您的代码中,您将 array 传递给 before
,或者在您的情况下 acc
,并连接(合并)一个新数组gadgets['computers']
和 returns 那个数组。这将根据对象数组创建计算机列表。
关于 reduce
here 的更多信息。
But shouldn't it return
我不确定你想向我们展示什么,但如果你的意思是
[['asus','hp'],['dell', 'insys']]
那么不,不应该。 concat
将传递给它的数组展平(到一个级别):
const a = [].concat(['asus','hp'], ['dell', 'insys']);
console.log(a); // ["asus", "hp", "dell", "insys"]
所以acc.concat(gadjet[computers])
将每个computers
数组展平成一个新数组,这是reduce
.
的累加结果
如果您希望输出为数组数组。试试这个:
var gadjets = [
{ computers: ["asus", "hp"], sellphones: ["Galaxy", "Nokia"] },
{ computers: ["dell", "insys"], sellphones: ["iphone", "samsung"] }
];
const groupBy = key => {
let res = gadjets.reduce((objectsByKeyValue, obj) => {
let arr = [];
arr.push(obj[key]);
return objectsByKeyValue.concat(arr);
}, []);
return res;
};
console.log(groupBy("computers"));
所以我一直在寻找平面地图的一些解决方法,因为它在 IE 上不起作用,我找到了这个: 但我真的不明白为什么它有效
var gadjets = [
{computers:['asus', 'hp'],
sellphones:['Galaxy', 'Nokia']
},
{computers:['dell', 'insys'],
sellphones:['iphone', 'samsung']
}
];
const getValues = gadjets.reduce((acc, gadjet) => acc.concat(gadjet[computers]), []) // instead of gadjets.flatMap(gadjet=> gadjet[computers])
此代码 returns:
['asus','hp','dell','insys']
但不应该 return:
['asus','hp'],['dell', 'insys']
这是因为reduce
把你给它的元素加起来了。例如,采用以下代码:
let arr = [1,2,3,4,5];
console.log(arr.reduce((before, value)=>before+value));
此代码获取每个 value
并将其添加到 before
。然后它将添加的值传递到 before
变量中 reduce
的下一次迭代。
在您的代码中,您将 array 传递给 before
,或者在您的情况下 acc
,并连接(合并)一个新数组gadgets['computers']
和 returns 那个数组。这将根据对象数组创建计算机列表。
关于 reduce
here 的更多信息。
But shouldn't it return
我不确定你想向我们展示什么,但如果你的意思是
[['asus','hp'],['dell', 'insys']]
那么不,不应该。 concat
将传递给它的数组展平(到一个级别):
const a = [].concat(['asus','hp'], ['dell', 'insys']);
console.log(a); // ["asus", "hp", "dell", "insys"]
所以acc.concat(gadjet[computers])
将每个computers
数组展平成一个新数组,这是reduce
.
如果您希望输出为数组数组。试试这个:
var gadjets = [
{ computers: ["asus", "hp"], sellphones: ["Galaxy", "Nokia"] },
{ computers: ["dell", "insys"], sellphones: ["iphone", "samsung"] }
];
const groupBy = key => {
let res = gadjets.reduce((objectsByKeyValue, obj) => {
let arr = [];
arr.push(obj[key]);
return objectsByKeyValue.concat(arr);
}, []);
return res;
};
console.log(groupBy("computers"));