使用reduce()将元素拆分为数组

时间:2016-12-20 13:21:17

标签: javascript arrays ecmascript-6 reduce

我在图表中有一些边缘,我得到了:

const edges = getEdges();

每个边都有一个标签数组,我得到了:

const edges = getEdges().map(function (edge, i) {
  return (i + 1) + '-' + getLabels(edge).sort().join('-');
});

因此,如果我有2条边,每条边有两个标签,我会得到一个数组

[
  '1-label1-label2',
  '2-label1-label2'
]

但我想要的是

[
  '1-label1',
  '2-label2',
  '3-label1',
  '4-label2'
]

所以我想我需要使用Array.reduce()

5 个答案:

答案 0 :(得分:2)

使用Array#reduce方法执行类似的操作。

const edges = getEdges().reduce(function(arr, edge) {
  return arr.concat(
    getLabels(edge)
    .sort()
    .map(function(v, i) {
      return (arr.length + i) + '-' + v;
    })
  );
}, []);

使用Array#push方法代替Array#concat方法。

const edges = getEdges().reduce(function(arr, edge) {
  [].push.apply(arr, getLabels(edge)
    .sort()
    .map(function(v, i) {
      return (arr.length + i) + '-' + v;
    })
  );
  return arr;
}, []);

答案 1 :(得分:0)

在我看来,mapreduce是你真正想要的,只是一对嵌套的forEach(虽然我们可以用{{1}如果我们想要的话):

reduce

直播示例:

const edges = [];
getEdges().forEach(edge => {
  getLabels(edge).sort().forEach(label => {
    edges.push(`${(edges.length + 1)}-${label}`);
  });
});

答案 2 :(得分:0)

您可以在边缘上使用reduce操作,它会获取每条边并添加到新构造的数组中。

在每个边缘的标签上使用forEach会产生1..n个项目,这些项目将添加到此新阵列中。使用新数组(结果)的当前长度可以巧妙地解决根据需要命名结果项的问题(即从1到N)。

i= 1;
if (i>0 && i<5) { 

        //if(MouseScrollUp)
    //i++;
    document.querySelector('.number').innerHTML = i;

    //else if(MouseScrollDown)
    //i--;
    // document.querySelector('.number').innerHTML = number;

}

注意:此解决方案使用reduce和ES6功能,这是根据上述标记。

答案 3 :(得分:0)

您可以先将getEdges的结果映射到getLabels,然后使用Array.prototype.concat和展开语法展平生成的数组。

const getEdges = () => ['a', 'b'];
const getLabels = () => ['label1', 'label2'];

const edges = [].concat(...getEdges().map(getLabels))
  .map((label, i) => `${i + 1}-label`);
console.log(edges);

答案 4 :(得分:0)

您可以使用forEach,而不是mapreduce

工作代码 :( ES6)

const getEdges = () => [
     '1-label1-label2',
     '2-label1-label2'
   ];

const getLabels = (edge) => edge.split('-').sort();

let edges = [];

getEdges().forEach((edge) => {
  getLabels(edge).forEach((label) => {
    if(label.indexOf('label') > -1) {
       edges.push(edges.length + 1 + '-' + label);
    }
  });
});

console.log(edges);

工作代码 :( ES5)

function getEdges() {
   return [
     '1-label1-label2',
     '2-label1-label2'
   ];
}

function getLabels(edge) {
  return edge.split('-').sort();
}

var edges = [];

getEdges().forEach(function (edge) {
  getLabels(edge).forEach(function (label) {
    if(label.indexOf('label') > -1) {
       edges.push(edges.length + 1 + '-' + label);
    }
  });
});

console.log(edges);