Javascript 使用reduce()将元素拆分为数组
我在一个图中有一些边,这是我得到的:Javascript 使用reduce()将元素拆分为数组,javascript,arrays,ecmascript-6,reduce,Javascript,Arrays,Ecmascript 6,Reduce,我在一个图中有一些边,这是我得到的: const edges = getEdges(); const edges = getEdges().map(function (edge, i) { return (i + 1) + '-' + getLabels(edge).sort().join('-'); }); 每个边都有一个标签数组,我可以从中得到: const edges = getEdges(); const edges = getEdges().map(function (edg
const edges = getEdges();
const edges = getEdges().map(function (edge, i) {
return (i + 1) + '-' + getLabels(edge).sort().join('-');
});
每个边都有一个标签数组,我可以从中得到:
const edges = getEdges();
const edges = getEdges().map(function (edge, i) {
return (i + 1) + '-' + getLabels(edge).sort().join('-');
});
如果我有两条边,每条边都有两个标签,我得到一个数组
[
'1-label1-label2',
'2-label1-label2'
]
但我想要的是
[
'1-label1',
'2-label2',
'3-label1',
'4-label2'
]
所以我想我需要使用Array.reduce()
const edges = getEdges().reduce(function(arr, edge) {
return arr.concat(
getLabels(edge)
.sort()
.map(function(v, i) {
return (arr.length + i) + '-' + v;
})
);
}, []);
用方法代替方法
在我看来,map
或reduce
都不是您真正想要的,只是一对嵌套的forEach
(尽管我们可以在需要时将reduce
鞋喇叭穿进去):
实例:
constgetedges=()=>
[
{标签:['label2','label1']},
{标签:['label1','label2']}
];
const getLabels=edge=>edge.labels;
常数边=[];
GetEdge().forEach(edge=>{
getLabels(edge).sort().forEach(标签=>{
push(`${(edges.length+1)}-${label}`);
});
});
控制台。原木(边缘)代码>可以在边上使用reduce操作,该操作获取每条边并将其添加到新构造的数组中
在每个边的标签上使用forEach将产生1..n个项,这些项将添加到此新数组中。使用新数组(结果)的当前长度可以巧妙地解决根据需要命名结果项的问题(即从1到N)
注意:此解决方案使用了reduce和ES6功能,这与提到的标记一致。您可以首先将GetEdge
的结果映射到getLabels
,然后使用和扩展语法展平生成的数组
constgetedges=()=>['a','b'];
常量getLabels=()=>['label1','label2'];
常量边=[].concat(…GetEdge().map(getLabels))
.map((label,i)=>`${i+1}-label`);
控制台。原木(边缘)
您可以使用下面的forEach
而不是map
或reduce
工作片段:(ES6)
constgetedges=()=>[
“1-label1-label2”,
“2-label1-label2”
];
const getLabels=(edge)=>edge.split('-').sort();
设边=[];
GetEdge().forEach((边)=>{
getLabels(edge).forEach((标签)=>{
if(label.indexOf('label')>-1){
边.推(边.长度+1+'-'+标签);
}
});
});
控制台。原木(边缘)代码>逻辑是什么?我们可以举一个边缘的例子吗?虽然这个代码片段可以解决这个问题,但它确实有助于提高文章的质量。请记住,您将在将来回答读者的问题,这些人可能不知道您的代码建议的原因。还请尽量不要用解释性注释挤满你的代码,这会降低代码和解释的可读性!补充说明
const res = getEdges().reduce(result, edge => {
const labels = getLabels(edge).sort();
labels.forEach(label => result.push(`${result.length + 1}-${label}`));
return result;
}, []);