为什么这个功能会过滤掉' null'值?

时间:2016-04-26 15:22:16

标签: javascript arrays switch-statement prototypejs

我正在尝试编写一个过滤掉任何虚假值的快速函数。这似乎抓住了除了' null'。

之外的所有东西

请帮忙!

def find_paths(self, start, end, weight_limit=10):
        res = []

        def dfs(start, end, path=[], weight=0):
            path = path + [start]
            if len(path) > 1:
                weight += self.weights[(path[-2], start)]
            if weight > weight_limit:
                return []
            if start == end:
                res.append((path, weight))
                return [path]
            if start not in self.adjacent:
                return []
            paths = []
            for node in self.adjacent[start]:
                if node not in path:
                    paths.extend(dfs(node, end, path, weight))
            return paths

        dfs(start, end)
        return res

2 个答案:

答案 0 :(得分:2)

您无法检查NaN

在JavaScript中,NaN !== NaNtrue。这就是您应该使用Number.isNaN检查值是否为NaN的原因;这也是您的过滤器不适用于NaN值的原因。 switch语句永远不会到达NaN case的主体,因为内部相等检查总是会失败。

如果您只想过滤掉虚假值,您可以依靠他们的虚假而不是检查他们的确切值,这会更快:

[1, null, undefined, NaN, 0, "", true].filter(x => x); // [1, true]

答案 1 :(得分:0)

首先,您当前的代码过滤掉null值(但不会过滤掉NaN)。 See what I'm talking about

在您的示例中,注意NaN !== NaN非常重要,因为现在可以判断"不是数字"与另一个元素相同,而不是数字"。

从数组中省略任何虚假值的一种更简单的方法是迭代数组,并返回任何真正的值:

function noFalsy(arr){
    var output = [];
    arr.filter(function(element){
        // If the element is not falsy, add it to our output array
        if(element){
            output.push(element);
        }
    });
    return output;
}

console.log(noFalsy([1, true, 0, null, false, NaN])); // => [1, true]

Working Fiddle