在 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;
});

removeableIndex0 时,计算 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/