如何实现元素与列表元素比较后按大小规则插入列表?
问题分析与解决方案
你的代码存在以下核心问题:
append函数逻辑完全错误:循环条件i > this.dataStore.value无意义(数组没有value属性),且判断条件错误地访问了不存在的value属性,还直接引用全局实例names,导致无法正确执行插入逻辑。- 未实现“仅当元素大于列表所有现有元素时才插入”的核心判断逻辑。
以下是修正后的代码,完全满足你的需求:
function List() { this.dataStore = []; this.listSize = 0; this.pos = 0; this.append = append; this.isGreaterThanAll = isGreaterThanAll; // 新增辅助方法判断是否大于所有元素 } // 判断元素是否大于列表中所有现有元素 function isGreaterThanAll(element) { // 列表为空时,直接返回true if (this.dataStore.length === 0) { return true; } // 遍历所有元素,只要有一个元素不小于当前元素,就返回false for (let i = 0; i < this.dataStore.length; i++) { if (this.dataStore[i] >= element) { return false; } } return true; } // 仅当元素大于所有现有元素时,将其插入列表末尾 function append(element) { if (this.isGreaterThanAll(element)) { this.dataStore.push(element); this.listSize = this.dataStore.length; // 同步listSize this.pos = this.listSize; // 同步pos到末尾 return true; // 返回插入成功状态 } return false; // 不满足条件则不插入 } // 保留你原有的find方法 function find(element) { for (var i = 0; i < this.dataStore.length; ++i) { if (this.dataStore[i] === element) { return i; } } return -1; } // 测试代码 var names = new List(); console.log(names.append("Jascien")); // 列表为空,插入成功,输出true console.log(names.dataStore); // 输出: ["Jascien"] console.log(names.append("Jas")); // "Jas"小于"Jascien",不插入,输出false console.log(names.dataStore); // 输出: ["Jascien"] console.log(names.append("John")); // "John"大于"Jascien",插入成功,输出true console.log(names.dataStore); // 输出: ["Jascien", "John"]
关键说明
isGreaterThanAll方法:专门负责判断待插入元素是否大于列表中所有元素,利用JavaScript原生的>/>=运算符,自动适配数值和文本的比较规则(文本按字母排序,数值按大小)。append方法:先调用判断方法,只有满足条件时才将元素插入列表末尾,并同步更新listSize和pos属性。- 测试结果符合预期:"Jas"因为小于现有元素"Jascien"被拒绝插入,"John"因为大于现有元素被插入到末尾。
内容的提问来源于stack exchange,提问作者John Mark Entrina
相关产品推荐
相关产品推荐

