我有一个数组:
let items = ["apple", "orange", "watermelon", "blueberry", "lemon", "guava"];我希望从第一个索引中依次删除数组值。因此,它将产生:
[ "apple", "orange", "watermelon", "blueberry", "lemon", "guava" ]
[ "orange", "watermelon", "blueberry", "lemon", "guava" ]
[ "watermelon", "blueberry", "lemon", "guava" ]
[ "blueberry", "lemon", "guava" ]
[ "lemon", "guava" ]
[ "guava" ]我已经试过这个代码了:
let items = ["apple", "orange", "watermelon", "blueberry", "lemon", "guava"];
runLoop = async () => {
for(const item of items){
await new Promise( resolve => setTimeout( resolve, 1000 ));
console.log(items);
remove(items, item);
console.log('------------');
}
}
function remove(array, element) {
console.log('deleting '+element);
const index = array.indexOf(element);
array.splice(index, 1);
}但结果与我所期望的不一样,这就是结果:
Array(6) [ "apple", "orange", "watermelon", "blueberry", "lemon", "guava" ]
Array(5) [ "orange", "watermelon", "blueberry", "lemon", "guava" ]
Array(4) [ "orange", "blueberry", "lemon", "guava" ] 发布于 2019-04-11 09:22:31
问题是数组可迭代性是活动的--如果您使用for..of调用迭代器并在该迭代器仍在使用时对该数组进行变异,那么迭代得到的结果项可能是不直观的--可能会遗漏一些指示。就像这里发生的事情:
let items = ["apple", "orange", "watermelon", "blueberry", "lemon", "guava"];
for (let i = 0; i < items.length; i++) {
console.log('item: ', items[i]);
items.splice(i, 1);
}
循环只运行3次,因为在迭代数组时要从数组中移除项,因此跳过了一些指示符。
一种可能的方法是,在使用for..of调用迭代器时,首先复制数组,这样迭代器将始终按顺序遍历原始数组中的每个项:
let items = ["apple", "orange", "watermelon", "blueberry", "lemon", "guava"];
runLoop = async () => {
for(const item of items.slice()){
await new Promise( resolve => setTimeout( resolve, 300 ));
console.log(items);
remove(items, item);
console.log('------------');
}
}
function remove(array, element) {
console.log('deleting '+element);
const index = array.indexOf(element);
array.splice(index, 1);
}
runLoop();
发布于 2019-04-11 09:18:25
你需要在索引0处拼接,
array.splice(0, 1);或者只是转移第一个元素。
array.shift();发布于 2019-04-11 09:40:48
您可以使用Array.slice来实现这一点。使用剪接时,请记住,它将影响原始数组,这不应按照javascript的功能方法进行。函数式编程不建议修改原始对象。
let items = ["apple", "orange", "watermelon", "blueberry", "lemon", "guava"];
for(let i=0;i<items.length;i++){
console.log(items.slice(i,items.length));
}
https://stackoverflow.com/questions/55628872
复制相似问题