Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在数组中循环并移除项,而不中断循环_Javascript_Loops - Fatal编程技术网

Javascript 在数组中循环并移除项,而不中断循环

Javascript 在数组中循环并移除项,而不中断循环,javascript,loops,Javascript,Loops,我有以下for循环,当我使用splice()删除一个项目时,我会得到“秒”是未定义的。我可以检查它是否未定义,但我觉得可能有一种更优雅的方法来实现这一点。我们的愿望是简单地删除一个项目并继续下去 for (i = 0, len = Auction.auctions.length; i < len; i++) { auction = Auction.auctions[i]; Auction.auctions[i]['seconds'] --; if (auction.

我有以下for循环,当我使用
splice()
删除一个项目时,我会得到“秒”是未定义的。我可以检查它是否未定义,但我觉得可能有一种更优雅的方法来实现这一点。我们的愿望是简单地删除一个项目并继续下去

for (i = 0, len = Auction.auctions.length; i < len; i++) {
    auction = Auction.auctions[i];
    Auction.auctions[i]['seconds'] --;
    if (auction.seconds < 0) { 
        Auction.auctions.splice(i, 1);
    }           
}
for(i=0,len=Auction.auctions.length;i
每次通过循环而不是在开始时重新计算长度,例如:

for (i = 0; i < Auction.auctions.length; i++) {
      auction = Auction.auctions[i];
      Auction.auctions[i]['seconds'] --;
      if (auction.seconds < 0) { 
          Auction.auctions.splice(i, 1);
          i--; //decrement
      }
}
for(i=0;i
这样你就不会越界了


编辑:在if语句中添加减量。

每次通过循环而不是仅在开始时重新计算长度,例如:

for (i = 0; i < Auction.auctions.length; i++) {
      auction = Auction.auctions[i];
      Auction.auctions[i]['seconds'] --;
      if (auction.seconds < 0) { 
          Auction.auctions.splice(i, 1);
          i--; //decrement
      }
}
for(i=0;i
这样你就不会越界了


编辑:在if语句中添加减量。

当您执行
.splice()
时,数组将被重新索引,这意味着您将在删除索引时跳过索引,并且缓存的
.length
已过时

要修复它,您需要在
.splice()
之后减小
i
,或者简单地反向迭代

var i = Auction.auctions.length
while (i--) {
    ...
    if (...) { 
        Auction.auctions.splice(i, 1);
    } 
}

这样,重新索引不会影响迭代中的下一个项目,因为索引只影响从当前点到数组末尾的项目,并且迭代中的下一个项目低于当前点。

执行
.splice()
时,数组将被重新索引,这意味着您将在删除某个索引时跳过该索引,并且缓存的
.length
已过时

要修复它,您需要在
.splice()
之后减小
i
,或者简单地反向迭代

var i = Auction.auctions.length
while (i--) {
    ...
    if (...) { 
        Auction.auctions.splice(i, 1);
    } 
}

这样,重新索引不会影响迭代中的下一项,因为索引只影响从当前点到数组末尾的项,迭代中的下一项低于当前点。

虽然您的问题是从迭代的数组中删除元素,而不是高效地删除元素(除了一些其他处理),但我认为如果在类似情况下,应该重新考虑

这种方法的算法复杂性是
O(n^2)
,因为拼接函数和for循环都在数组中迭代(拼接函数在最坏的情况下移动数组的所有元素)。相反,您可以将所需的元素推送到新数组中,然后将该数组分配给所需的变量(该变量刚刚被迭代)


虽然您的问题是从迭代的数组中删除元素,而不是高效地删除元素(除了一些其他处理),但我认为如果在类似情况下,应该重新考虑

这种方法的算法复杂性是
O(n^2)
,因为拼接函数和for循环都在数组中迭代(拼接函数在最坏的情况下移动数组的所有元素)。相反,您可以将所需的元素推送到新数组中,然后将该数组分配给所需的变量(该变量刚刚被迭代)


这是一个相当普遍的问题。解决方案是向后循环:

for (var i = Auction.auctions.length - 1; i >= 0; i--) {
    Auction.auctions[i].seconds--;
    if (Auction.auctions[i].seconds < 0) { 
        Auction.auctions.splice(i, 1);
    }
}
for(var i=Auction.auctions.length-1;i>=0;i--){
拍卖.拍卖[i].秒--;
if(Auction.auctions[i].seconds<0){
拍卖.拍卖.拼接(i,1);
}
}

如果你把它们从末尾弹出,这无关紧要,因为当你向后走的时候,索引会被保留下来。

这是一个非常常见的问题。解决方案是向后循环:

for (var i = Auction.auctions.length - 1; i >= 0; i--) {
    Auction.auctions[i].seconds--;
    if (Auction.auctions[i].seconds < 0) { 
        Auction.auctions.splice(i, 1);
    }
}
for(var i=Auction.auctions.length-1;i>=0;i--){
拍卖.拍卖[i].秒--;
if(Auction.auctions[i].seconds<0){
拍卖.拍卖.拼接(i,1);
}
}

如果从末尾弹出它们并不重要,因为索引将在返回时保留。

在循环时尝试将数组中继到新数组中:

var auctions = Auction.auctions;
var auctionIndex;
var auction;
var newAuctions = [];

for (
  auctionIndex = 0; 
  auctionIndex < Auction.auctions.length;
  auctionIndex++) {

  auction = auctions[auctionIndex];

  if (auction.seconds >= 0) { 
    newAuctions.push(
      auction);
  }    
}

Auction.auctions = newAuctions;
var auctions=Auction.auctions;
var拍卖指数;
var拍卖;
var newAuctions=[];
为了(
拍卖指数=0;
auctionIndex=0){
推(
拍卖);
}    
}
Auction.auctions=newAuctions;

循环时尝试将数组中继到新数组中:

var auctions = Auction.auctions;
var auctionIndex;
var auction;
var newAuctions = [];

for (
  auctionIndex = 0; 
  auctionIndex < Auction.auctions.length;
  auctionIndex++) {

  auction = auctions[auctionIndex];

  if (auction.seconds >= 0) { 
    newAuctions.push(
      auction);
  }    
}

Auction.auctions = newAuctions;
var auctions=Auction.auctions;
var拍卖指数;
var拍卖;
var newAuctions=[];
为了(
拍卖指数=0;
auctionIndex=0){
推(
拍卖);
}    
}
Auction.auctions=newAuctions;

这里是正确使用接头的另一个示例。此示例将从“数组”中删除“属性”

for (var i = array.length; i--;) {
    if (array[i] === 'attribute') {
        array.splice(i, 1);
    }
}

下面是正确使用接头的另一个示例。此示例将从“数组”中删除“属性”

for (var i = array.length; i--;) {
    if (array[i] === 'attribute') {
        array.splice(i, 1);
    }
}

另一个简单的解决方案是一次性消化数组元素:

while(Auction.auctions.length){
    // From first to last...
    var auction = Auction.auctions.shift();
    // From last to first...
    var auction = Auction.auctions.pop();

    // Do stuff with auction
}

另一个简单的解决方案是一次性消化数组元素:

while(Auction.auctions.length){
    // From first to last...
    var auction = Auction.auctions.shift();
    // From last to first...
    var auction = Auction.auctions.pop();

    // Do stuff with auction
}
for(i=0,len=Auction.auctions.length;i
用于(i=0,len=Au
Array.splice(index,1) - removes the element at the index 
(Example ONE)
// Remove from Listing the Items Checked in Checkbox for Delete
let temp_products_images = store.state.c_products.products_images
if (temp_products_images != null) {
    for (var l = temp_products_images.length; l--;) {
        // 'mark' is the checkbox field
        if (temp_products_images[l].mark == true) {
            store.state.c_products.products_images.splice(l,1);         // THIS WORKS
            // this.$delete(store.state.c_products.products_images,l);  // THIS ALSO WORKS
        }
    }
}

(Example TWO)
// Remove from Listing the Items Checked in Checkbox for Delete
let temp_products_images = store.state.c_products.products_images
if (temp_products_images != null) {
    let l = temp_products_images.length
    while (l--)
    {
        // 'mark' is the checkbox field
        if (temp_products_images[l].mark == true) {
            store.state.c_products.products_images.splice(l,1);         // THIS WORKS
            // this.$delete(store.state.c_products.products_images,l);  // THIS ALSO WORKS
        }
    }
}
        oldJson=[{firstName:'s1',lastName:'v1'},
                 {firstName:'s2',lastName:'v2'},
                 {firstName:'s3',lastName:'v3'}]
        
        newJson = oldJson.map(({...ele}) => {
          delete ele.firstName;
          return ele;
          })