Подчеркните 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);

Другие вопросы по тегам