![](/img/trans.png)
[英]Why Splice removes only last element when array elements are the same
[英]splice expected to remove multiple elements, but only removes one
我正在使用 splice 删除数组上的最后n
个元素(由quizResponseCountToRemove
表示)。
但是,在其当前的实现中,它只删除了 1 个元素。
这有什么特别的原因吗?
我的代码如下;
static removeCourseContentElementQuizResponseCount(
course: ICourse,
courseContents: ICourseContent[],
selectedCourseContentUid: string,
selectedCourseModule: number,
quizResponseCountToRemove: number
): ICourse {
courseContents.map((courseContent) => {
if (courseContent.uid === selectedCourseContentUid) {
courseContent.quiz.options.splice(-1, quizResponseCountToRemove);
if (courseContent.quiz.answer > courseContent.quiz.options.length) {
courseContent.quiz.answer = 1;
}
}
});
course.modules[selectedCourseModule].content = courseContents;
return course;
}
更新
看来我误解了 splice 的工作原理。 我希望 splice 从最后一个元素向后工作。 因此,在数组['test1', 'test2', 'test3', 'test4']
中,如果quizResponseCountToRemove
为 2,那么我最终得到['test1', 'test2']
。
如果您为第一个参数传递一个负数splice
,则这是从执行拼接操作的数组末尾的偏移量。 您正在传递-1
,因此它将对数组中的最后一个条目执行其操作。 根据定义,数组中只有最后一个条目,因此quizResponseCountToRemove
有多大并不重要。 如果它是任何超过0
的数字,则只会删除一个元素(最后一个)。
在评论中你说:
我希望 splice 从最后一个元素向后工作。 所以在一个数组
['test1', 'test2', 'test3', 'test4']
中,如果quizResponseCountToRemove
是2
那么我最终得到['test1', 'test2']
在这种情况下,您想从最后开始quizResponseCountToRemove
,因此您可以传入-quizResponseCountToRemove
:
courseContent.quiz.options.splice(-quizResponseCountToRemove, quizResponseCountToRemove);
......但这太复杂了。 要截断数组,您可以分配给它的length
:
courseContent.quiz.options.length -= quizResponseCountToRemove;
如果quizResponseCountToRemove
可能大于数组的长度,您需要确保不要尝试为length
分配负数(这会导致错误):
courseContent.quiz.options.length = Math.max(0, courseContent.quiz.options.length - quizResponseCountToRemove);
现场示例:
const courseContent = { quiz: { options: ["test1", "test2", "test3", "test4"], }, }; const quizResponseCountToRemove = 2; console.log("before", JSON.stringify(courseContent.quiz.options)); courseContent.quiz.options.length -= quizResponseCountToRemove; console.log("after", JSON.stringify(courseContent.quiz.options));
如果要截断数组,可以使用slice
。 设置数组length
的问题是length
应该是非负的,所以你需要添加一些检查。
在下面的代码片段中,即使delCount
是200
,也不需要额外的检查slice
只会返回一个空数组。 但请记住slice
返回一个新数组。
const arr = ["test1", "test2", "test3", "test4"], delCount = 2, newArr = arr.slice(0, -delCount); console.log(newArr)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.