我写了一个函数来满足以下条件:
"编写一个函数,给定一个字符串,生成所有字符索引的映射。例如, 索引(" 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]}

答案 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
。