在 if 条件下检查索引变量时,Array.Splice() 不会删除零索引处的元素
Array.Splice() does not remove element at zero index when the indexed variable is checked under if condition
为什么下面的数组没有被删除。
var removeableIndex =-1;
bookingStatus.bookings.filter(function(item, index) {
if(item.id == id){
removeableIndex = index;
return true;
}
return false;
});
console.log(removeableIndex)
if(removeableIndex)
var result = bookingStatus.bookings.splice(removeableIndex,1);
我已经通过了正确的预订数组。
过滤器正确匹配。
当 removeableIndex 为 0 时,这不会删除项目。假设如果 removeableIndex 大于零,它将被删除。
下面的代码稍作改动,适用于所有情况,包括 removeableIndex 为 0。
var removeableIndex =-1;
bookingStatus.bookings.filter(function(item, index) {
if(item.id == id){
removeableIndex = index;
return true;
}
return false;
});
console.log(removeableIndex)
if(removeableIndex > -1)
var result = bookingStatus.bookings.splice(removeableIndex,1);
唯一不同的是 if(removeableIndex > -1)
我想知道为什么第一组代码没有仅在索引为零时才删除该项目。
当索引为零时,此条件将为假:
if(removeableIndex)
当您将变量用作整个条件时,它将被评估为布尔值。它的工作原理与:
if(removeableIndex != 0)
了解 JavaScript 如何将数字计算为布尔值很重要。 0 被评估为假,所有其他数字被评估为真。
因为您的 removeableIndex
以 -1 开头,所以它的计算结果为真。如果您的过滤器与索引 0 处的项目匹配,它将评估为 false。
如果您将默认值更改为计算结果为 false 的值,那么问题就解决了一半,但您还必须检查该值是否为 0,因为这将计算为 false。
var removeableIndex; // If we leave the variable undefined, it will evaluate false.
bookingStatus.bookings.filter(function(item, index) {
if(item.id == id){
removeableIndex = index;
return true;
}
return false;
});
console.log(removeableIndex)
if(removeableIndex || removeableIndex === 0)
// If removeableIndex evaluates to true, or is equal to 0
var result = bookingStatus.bookings.splice(removeableIndex,1);
// remove the index
不过,您应该可以使用下面的代码,因为Array.prototype.filter()
return是一个基于回调函数return值的数组
var result = bookingStatus.bookings.filter(function(item, index) {
return item.id !== id;
});
当 removeableIndex
为 0
时,计算 if(removeableIndex)
将为假,因为 0
是一个错误的 y 值。所以,你应该这样评价它,
if(removeableIndex >= 0)
或者提高警惕,
var removeableIndex; //Leave the removeableIndex undefined.
//... Do what you are doing
if(type of removeableIndex != "undefined" && removeableIndex >= 0)
有关 JavaScript 中 Truthy/Falsy 值的更多信息,请访问此处:
http://www.sitepoint.com/javascript-truthy-falsy/
为什么下面的数组没有被删除。
var removeableIndex =-1;
bookingStatus.bookings.filter(function(item, index) {
if(item.id == id){
removeableIndex = index;
return true;
}
return false;
});
console.log(removeableIndex)
if(removeableIndex)
var result = bookingStatus.bookings.splice(removeableIndex,1);
我已经通过了正确的预订数组。 过滤器正确匹配。 当 removeableIndex 为 0 时,这不会删除项目。假设如果 removeableIndex 大于零,它将被删除。
下面的代码稍作改动,适用于所有情况,包括 removeableIndex 为 0。
var removeableIndex =-1;
bookingStatus.bookings.filter(function(item, index) {
if(item.id == id){
removeableIndex = index;
return true;
}
return false;
});
console.log(removeableIndex)
if(removeableIndex > -1)
var result = bookingStatus.bookings.splice(removeableIndex,1);
唯一不同的是 if(removeableIndex > -1)
我想知道为什么第一组代码没有仅在索引为零时才删除该项目。
当索引为零时,此条件将为假:
if(removeableIndex)
当您将变量用作整个条件时,它将被评估为布尔值。它的工作原理与:
if(removeableIndex != 0)
了解 JavaScript 如何将数字计算为布尔值很重要。 0 被评估为假,所有其他数字被评估为真。
因为您的 removeableIndex
以 -1 开头,所以它的计算结果为真。如果您的过滤器与索引 0 处的项目匹配,它将评估为 false。
如果您将默认值更改为计算结果为 false 的值,那么问题就解决了一半,但您还必须检查该值是否为 0,因为这将计算为 false。
var removeableIndex; // If we leave the variable undefined, it will evaluate false.
bookingStatus.bookings.filter(function(item, index) {
if(item.id == id){
removeableIndex = index;
return true;
}
return false;
});
console.log(removeableIndex)
if(removeableIndex || removeableIndex === 0)
// If removeableIndex evaluates to true, or is equal to 0
var result = bookingStatus.bookings.splice(removeableIndex,1);
// remove the index
不过,您应该可以使用下面的代码,因为Array.prototype.filter()
return是一个基于回调函数return值的数组
var result = bookingStatus.bookings.filter(function(item, index) {
return item.id !== id;
});
当 removeableIndex
为 0
时,计算 if(removeableIndex)
将为假,因为 0
是一个错误的 y 值。所以,你应该这样评价它,
if(removeableIndex >= 0)
或者提高警惕,
var removeableIndex; //Leave the removeableIndex undefined.
//... Do what you are doing
if(type of removeableIndex != "undefined" && removeableIndex >= 0)
有关 JavaScript 中 Truthy/Falsy 值的更多信息,请访问此处: http://www.sitepoint.com/javascript-truthy-falsy/