Подчеркните JS: сокращение в массив вызывает неопределенную ошибку метода на аккумуляторе
У меня есть код, похожий на этот, который я пытаюсь использовать для создания массива, состоящего из трех подмассивов:
f = [1, 2.5, 3, 10]
p = [1.2, 5.1, 6.3, 11]
r = [1, 1, 1, 1]
coords = _.reduce([f, p, r], function(memo, series){
if(series.length){
memo.push(_.map(series, function(s, i){
return {x: s, y: i*100};
}));
}
}, []);
console.log(coords);
Конечный результат должен выглядеть так:
[
[{x:1,y:100},{x:2,y:2.5}...],
[{x:1,y:12},{x:2,y:51}...]
]
Однако, когда я пытаюсь выполнить код, он возвращает cannot read property push of undefined
, Когда я проверяю ошибку в Chrome, он указывает на memo.push
линия. Код кажется мне нормальным, но я не могу понять, где моя ошибка. Любая помощь приветствуется.
2 ответа
Вы должны return
что-то из вашего обратного обратного вызова, чтобы стать новым значением аккумулятора. Иначе memo
вернется как undefined
в следующей итерации и конечный результат...
return memo;
бы исправить это, однако я чувствую, что вы на самом деле не хотите использовать reduce
:
var coords = _.map(_.filter([f, p, r], function(series) {
return series.length; // > 0
}), function(nonemptyseries) {
return _.map(nonemptyseries, function(s, i){
return {x: s, y: i*100};
});
});
_.reduce
Метод должен возвращать некоторое значение, чтобы следующая итерация была принята в качестве входных данных.
Если вы шагаете по коду (вставьте debugger
заявление перед _.reduce
), вы можете видеть, что это удается в первый раз, но memo
не определено во втором цикле.
В этом случае вы, вероятно, хотите вернуться memo
от сокращения, добавили ли вы новые элементы к нему или нет (если серия была пустой, продолжайте переходить к следующей серии).
Что-то вроде:
f = [1, 2.5, 3, 10]
p = [1.2, 5.1, 6.3, 11]
r = [1, 1, 1, 1]
coords = _.reduce([f, p, r], function(memo, series) {
if (series.length) {
memo.push(_.map(series, function(s, i) {
return {
x: s,
y: i * 100
};
}));
}
return memo;
}, []);
console.log(coords);