无法在JavaScript中读取null的属性“length”

时间:2017-02-10 12:54:39

标签: javascript

我正在对代码战做this次挑战,它通过了所有测试,但我收到了错误:

  

TypeError:无法读取null

的属性“length”

所以我无法克服挑战。谁能告诉我这段代码有什么问题?

mov

4 个答案:

答案 0 :(得分:3)

您无法处理的指令中有一个重要部分:

  

如果数组有0或1个值或者为null或None,则您的方法应返回一个空数组。

function averages(numbers) {
  if (!numbers) return []; // return empty array

  for(var i=0; i<numbers.length; i++){
    if(numbers.length < 2 || numbers[i] === ""){
      return [];
    } else {
      numbers[i] = (numbers[i] + numbers[i+1]) / 2;
    }
  }
  numbers.pop();
  return numbers
}

答案 1 :(得分:1)

您只需要测试参数是否为空

  //test if numbers is null
  if(numbers == null){
    return [];
  }
  for(var i=0; i<numbers.length; i++){
    if(numbers.length < 2 || numbers[i] === ""){
      return [];
    } else {
      numbers[i] = (numbers[i] + numbers[i+1]) / 2;
    }
  }
  numbers.pop();
  return numbers

答案 2 :(得分:0)

class TableViewController: UITableViewController {

let tableData = ["Matthew", "Mark", "Luke", "John"]

override func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return tableData.count
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as UITableViewCell
    cell.textLabel?.text = tableData[indexPath.row]
    return cell
}

override func viewDidLoad() {
    super.viewDidLoad()

    self.tableView.dataSource = self
//Did this part as comments to try to do this outside the class   
//        self.view.frame = CGRect(x: 0, y: 0, width: 320, height: 480)
//        self.tableView = UITableView(frame:self.view.frame)
//        self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")
    self.view.addSubview(self.tableView)

}

}
let frame = CGRect(x: 0, y: 0, width: 320, height: 480)
let tableView = UITableView(frame: frame, style: .plain)
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")
PlaygroundPage.current.liveView = TableViewController()

只需在ur数字变量中添加空检查。那你很高兴。

答案 3 :(得分:0)

更正您的代码:

function averages(numbers) {
  if (!Array.isArray(numbers)) {
    return [];
  }
  for(var i=0; i<numbers.length; i++){
    if(numbers.length < 2){
      return [];
    } else {
      numbers[i] = (numbers[i] + numbers[i+1]) / 2;
    }
  }
  numbers.pop();
  return numbers
}

我使用Array.isArray来检查它是否真的是一个数组。它是一个内置函数,所以你应该使用它。

您可以一步检查这个和长度,节省更多步骤(请参见下面的示例)。

提供更清洁的解决方案:

function averages(numbers) {
  if (!Array.isArray(numbers) || numbers.length < 2) {
    return [];
  }
  for(var i = 0; i < numbers.length - 1; i++){
      numbers[i] = (numbers[i] + numbers[i + 1]) / 2;
  }
  numbers.pop();
  return numbers
}

它工作正常,我还添加了一个&#34; -1&#34;循环,因为最后一个数字将成为&#34; NaN&#34; (不是数字),因为它之后没有元素和(10 + undefined) / 2 => NaN / 2 => NaN。这也为您的算法添加了不必要的步骤。

完成

另一个解决方案可能是Array:map:

function averages(numbers) {
  if (!Array.isArray(numbers) || numbers.length < 2) {
    return [];
  }
  numbers.map(function(val, idx, arr) {
    arr[idx] = (val + arr[idx+1]) / 2;
  });
  numbers.pop();
  return numbers;
}