Javascript 在数组中循环并移除项,而不中断循环
我有以下for循环,当我使用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.
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;
})