首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从第一个索引中依次删除数组javascript值

从第一个索引中依次删除数组javascript值
EN

Stack Overflow用户
提问于 2019-04-11 09:16:14
回答 3查看 52关注 0票数 1

我有一个数组:

代码语言:javascript
复制
let items = ["apple", "orange", "watermelon", "blueberry", "lemon", "guava"];

我希望从第一个索引中依次删除数组值。因此,它将产生:

代码语言:javascript
复制
[ "apple", "orange", "watermelon", "blueberry", "lemon", "guava" ]
[ "orange", "watermelon", "blueberry", "lemon", "guava" ]
[ "watermelon", "blueberry", "lemon", "guava" ]
[ "blueberry", "lemon", "guava" ]
[ "lemon", "guava" ]
[ "guava" ]

我已经试过这个代码了:

代码语言:javascript
复制
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);
 }

但结果与我所期望的不一样,这就是结果:

代码语言:javascript
复制
Array(6) [ "apple", "orange", "watermelon", "blueberry", "lemon", "guava" ]
Array(5) [ "orange", "watermelon", "blueberry", "lemon", "guava" ]
Array(4) [ "orange", "blueberry", "lemon", "guava" ] 
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-04-11 09:22:31

问题是数组可迭代性是活动的--如果您使用for..of调用迭代器并在该迭代器仍在使用时对该数组进行变异,那么迭代得到的结果项可能是不直观的--可能会遗漏一些指示。就像这里发生的事情:

代码语言:javascript
复制
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调用迭代器时,首先复制数组,这样迭代器将始终按顺序遍历原始数组中的每个项:

代码语言:javascript
复制
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();

票数 3
EN

Stack Overflow用户

发布于 2019-04-11 09:18:25

你需要在索引0处拼接,

代码语言:javascript
复制
array.splice(0, 1);

或者只是转移第一个元素。

代码语言:javascript
复制
array.shift();
票数 1
EN

Stack Overflow用户

发布于 2019-04-11 09:40:48

您可以使用Array.slice来实现这一点。使用剪接时,请记住,它将影响原始数组,这不应按照javascript的功能方法进行。函数式编程不建议修改原始对象。

代码语言:javascript
复制
let items = ["apple", "orange", "watermelon", "blueberry", "lemon", "guava"];

for(let i=0;i<items.length;i++){
   	console.log(items.slice(i,items.length));
 }

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55628872

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档