讨论社区

扁平化嵌套列表迭代器 运行bug

测试案例:[[1,1],2,[1,1]]

测试方法,使用编辑器中的提示代码

var nestedList =  [[1,1],2,[1,1]];
var i = new NestedIterator(nestedList), a = [];
while (i.hasNext()) {
    a.push(i.next());
}


我的实现

本地运行结果: [1, 1, 2, 1, 1],线上运行结果:[NaN,NaN,NaN]

 var NestedIterator = function (nestedList) {
    this.oriData = nestedList.hasOwnProperty('length') ? nestedList : [nestedList];
    this.index = -1;
    this.currentNest = null;
};

NestedIterator.prototype.hasNext = function () {
    return !((this.index === this.oriData.length - 1) && (!(this.currentNest && this.currentNest.hasNext())))
};

NestedIterator.prototype.next = function () {
    if (!this.hasNext()) {
        return null;
    }

    //数组
    if (this.currentNest && this.currentNest.hasNext()) {
        return this.currentNest.next()
    }

    var nextItem = this.oriData[++this.index];

    //非数组
    if (!nextItem.hasOwnProperty('length')) {
        this.currentNest = null;
        return nextItem
    }

    var nestedI = new NestedIterator(nextItem);
    this.currentNest = nestedI;
    return this.currentNest.next();
};



0 人关注了该问题 关注

0

刘岳 • 2月前

请先读一下题目模板的注释:

/**
 * // This is the interface that allows for creating nested lists. 
 * // You should not implement it, or speculate about its implementation 
 * function NestedInteger() { 
 * 
 *     Return true if this NestedInteger holds a single integer, rather than a nested list. 
 *     @return {boolean} 
 *     this.isInteger = function() { 
 *         ... 
 *     }; 
 * 
 *     Return the single integer that this NestedInteger holds, if it holds a single integer 
 *     Return null if this NestedInteger holds a nested list 
 *     @return {integer} 
 *     this.getInteger = function() { 
 *         ... 
 *     }; 
 * 
 *     Return the nested list that this NestedInteger holds, if it holds a nested list 
 *     Return null if this NestedInteger holds a single integer 
 *     @return {NestedInteger[]} 
 *     this.getList = function() { 
 *         ... 
 *     }; 
 * }; 
 */
/**
 * @constructor 
 * @param {NestedInteger[]} nestedList 
 */

题目中给的nestedList 是一个带有 NestedInteger 接口的对象,而不是一个数组,所以你的测试代码第一行:

var nestedList =  [[1,1],2,[1,1]];

是错误的。

你可以在题目模板中给的构造函数第一行加一句输出,看一下传进来的参数是什么样子的:

var NestedIterator = function(nestedList) {
    console.log(nestedList);
    this.oriData = nestedList.hasOwnProperty('length') ? nestedList : [nestedList];    
    this.index = -1;    
    this.currentNest = null;
};

标准输出如下:

[ NestedInteger {
    _integer: null,
    _list: [ [NestedInteger], [NestedInteger] ],
    isInteger: [Function],
    getInteger: [Function],
    setInteger: [Function],
    getList: [Function],
    add: [Function] },
  NestedInteger {
    _integer: 2,
    _list: [],
    isInteger: [Function],
    getInteger: [Function],
    setInteger: [Function],
    getList: [Function],
    add: [Function] },
  NestedInteger {
    _integer: null,
    _list: [ [NestedInteger], [NestedInteger] ],
    isInteger: [Function],
    getInteger: [Function],
    setInteger: [Function],
    getList: [Function],
    add: [Function] } ]


0 个讨论

您需要登录后才可回复
您需要登录后才可以回复