无法找出mapreduce算法



我已经把这个输入数组按键排序了:

var sortedArray = [ [ 'de', [ 1 ] ],
                    [ 'elle', [ 1 ] ],
                    [ 'elle', [ 1 ] ],
                    [ 'la', [ 1 ] ],
                    [ 'la', [ 1 ] ],
                    [ 'la', [ 1 ] ],
                    [ 'le', [ 1 ] ],
                    [ 'maison', [ 1 ] ],
                    [ 'voiture', [ 1 ] ],
                    [ 'voiture', [ 1 ] ] 
];

我想得到这个简化数组:

[ [ 'de', [ 1 ] ],
  [ 'elle', [ 1, 1 ] ],
  [ 'la', [ 1, 1, 1 ] ],
  [ 'le', [ 1 ] ],
  [ 'maison', [ 1 ] ],
  [ 'voiture', [ 1, 1 ] ] 
];

我这样继续:

sortedArray.forEach((elem, index, arr) => {
   if (elem[0] === arr[index + 1][0]){
      arr[index][1].push(1);
      arr.splice(index + 1, 1);
   }
});
console.log(sortedArray);

但是我不明白为什么我得到这个结果:

 [ [ 'de', [ 1 ] ],
   [ 'elle', [ 1, 1 ] ],
   [ 'la', [ 1, 1 ] ],
   [ 'la', [ 1 ] ],
   [ 'le', [ 1 ] ],
   [ 'maison', [ 1 ] ],
   [ 'voiture', [ 1, 1 ] ] 
 ]

问题是,你拼接你的数组,而迭代它没有重置当前索引。在使用splice时获得所需结果的一种方法是这样做:

sortedArray.forEach((elem, index, arr) => {
   while (arr[index + 1] && elem[0] === arr[index + 1][0]){
      arr[index][1].push(1);
      arr.splice(index + 1, 1);
   }
});

基本上,我们将if语句更改为while循环,并添加了一个额外的检查

使用Array.prototype.reduce创建一个新的数组。因为原始数组是排序的,您只需要将1推到数组中的最后一项,只要它与当前项相同,并在不为真时添加新项:

var sortedArray = [
  ['de', [1]],
  ['elle', [1]],
  ['elle', [1]],
  ['la', [1]],
  ['la', [1]],
  ['la', [1]],
  ['le', [1]],
  ['maison', [1]],
  ['voiture', [1]],
  ['voiture', [1]]
];
var result = sortedArray.reduce(function(result, item) {
  if (!result.length || item[0] !== result[result.length - 1][0]) { // check if 1st results array is empty or if current item 'key' doesn't match the last item it result
    result.push([item[0], []]); // push a new 'key' item with an empty array of 1s
  }
  result[result.length - 1][1].push(1); // push 1 to last item in result
  
  return result;
}, []);
console.log(result);

相关内容

  • 没有找到相关文章

最新更新