У меня есть метод сопоставления, который принимает обратный вызов в качестве аргумента, но я продолжаю получать эту ошибку JavaScript - PullRequest
0 голосов
/ 12 марта 2020

Я полностью сбит с толку, почему 'cb' не является функцией в моем случае.

В основном у меня есть конструктор 'Tree'

 this.value = value;
 this.children = [];
};

Tree.prototype.addChild = function (value){
 var newInstance = new Tree(value);
 this.children.push(newInstance);
}

Tree.prototype.map = function(cb){
 var copyTree = new Tree(this.value); //1
 copyTree.value = cb(copyTree.value);
 for (var i = 0; i < this.children.length; i++){ // i = 0; 2                 i = 0's value is 2
   copyTree.addChild(new Tree.prototype.map(cb(this.children[i].value)))
 }

 return copyTree;
}

и затем в консоли Я передал

var root1 = new Tree(1)
var branch1 = root1.addChild(2);
var branch2 = root1.addChild(3);

Теперь каждый раз, когда я вызываю

var newTree = root1.map(function (value) {
                        return value * 2 })

, я получаю эту ошибку.

VM1769 Script snippet %231:13 Uncaught TypeError: cb is not a function
    at new Tree.map (VM1769 Script snippet %231:13)
    at Tree.map (VM1769 Script snippet %231:19)
    at <anonymous>:1:21

Я знаю, что мой метод отображения может меня не смущает, но тот факт, что 'cb' не является функцией, сбивает меня с толку, я передаю анонимную функцию при вызове .map, но .. 'cb' не функция? Почему это?

1 Ответ

0 голосов
/ 12 марта 2020

Внутри .map, у вас есть массив деревьев для копирования внутри this.children. Поскольку массив состоит из деревьев, у этих деревьев уже есть метод .map, который можно вызвать для создания копии этого дерева. Измените

copyTree.addChild(new Tree.prototype.map(cb(this.children[i].value)))

на

copyTree.addChild(this.children[i].map(cb))

function Tree(value) {
  this.value = value;
  this.children = [];
};

Tree.prototype.addChild = function(value) {
  var newInstance = new Tree(value);
  this.children.push(newInstance);
}

Tree.prototype.map = function(cb) {
  var copyTree = new Tree(this.value);
  copyTree.value = cb(copyTree.value);
  for (var i = 0; i < this.children.length; i++) {
    copyTree.addChild(this.children[i].map(cb))
  }
  return copyTree;
}

var root1 = new Tree(1)
var branch1 = root1.addChild(2);
var branch2 = root1.addChild(3);


var newTree = root1.map(function(value) {
  return value * 2
})
console.log(newTree);

Более наглядно, используя современный синтаксис:

class Tree {
  constructor(value) {
    this.value = value;
    this.children = [];
  }
  addChild(value) {
    const newInstance = new Tree(value);
    this.children.push(newInstance);
  }
  map(cb) {
    const copyTree = new Tree(this.value);
    copyTree.value = cb(copyTree.value);
    for (const child of this.children) {
      copyTree.addChild(child.map(cb))
    }
    return copyTree;
  }
}
const root1 = new Tree(1)
const branch1 = root1.addChild(2);
const branch2 = root1.addChild(3);


const newTree = root1.map(value => value * 2);
console.log(newTree);
...