为什么减少这种方式?

时间:2015-04-10 15:46:43

标签: javascript reduce

我写了一个函数来满足以下条件:

"编写一个函数,给定一个字符串,生成所有字符索引的映射。例如, 索引(" Mississippi")应该返回一张关联“M' M'使用集合{0},' i'设置{1,4,7,10}和 等等。"

但为什么i 1的第一个值在我的实现中,从而切断了M



var s = 'Mississippi';

function indexes(s) {
  var acc = {};

  return s.split('').reduce(function(p, c, i) {
    if (!acc[c]) {
      acc[c] = [i];
    } else {
      acc[c].push(i);
    }

    return acc
  });
}
console.log(indexes(s)); // Object {i: Array[4], s: Array[4], p: Array[2]}




1 个答案:

答案 0 :(得分:3)

因为你没有为累加器指定初始值,所以第一次调用回调的数组中有第一个两个条目(例如,p将为{ {1}}和"M"将是c),但您没有使用"i",因此您最终错过了p

当你做一个直接的总和(例如)时,不提供初始值是有用的,但对于这个类的东西,我发现使用"M"的最简单方法提供初始值,如下:

reduce
var s = 'Mississippi';

function indexes(s) {
  // Note: No `acc` here
  return s.split('').reduce(function(p, c, i) {
    // Note: Using `p` here
    if (!p[c]) {
      p[c] = [i];
    } else {
      p[c].push(i);
    }

    return p;
  }, {});
  // ^^-- Initializing the accumulator here
}
snippet.log(JSON.stringify(indexes(s))); // {"M":[0],"i":[1,4,7,10],"s":[2,3,5,6],"p":[8,9]}

如果您希望继续使用外部<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 --> <script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>,我可能会使用acc而不是forEach