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;
}, []);