Array.every返回false而不是true

时间:2015-05-13 08:10:51

标签: javascript arrays function dynamic-arrays

我正在处理某些事情而且我编写的代码似乎返回false而不是true:

function checkValidUsers(validUsers) 
{
    var validIds = validUsers.map(function (user) { return user.id; });

    return function (users) 
    {
        var ids = users.map(function (user) { return user.id; });
        return ids.every(function (id) { return id in validIds; } );
    }
}

var check = checkValidUsers([{ id: 1 }, { id: 2 }, { id: 3 }]);

check([{ id: 2 }, { id: 3 }]);    // return false

两个map函数返回正确的数组(第一个为[1,2,3],第二个为[2,3]),但每个函数都没有出于某种原因。

任何人都可以帮我找到代码中的错误吗?

3 个答案:

答案 0 :(得分:2)

不要使用in来检查数组中是否有元素。

相反,请使用.indexOf方法。

return ids.every(function (id) { return validIds.indexOf(id) != -1; });

答案 1 :(得分:1)

in可以像coffeescript一样使用,但在JS中,它只是一个迭代器运算符。试试:

return ids.every(function (id) { return ~validIds.indexOf(id); });

您的代码中有一些丢失/错误的字符,这是一个完整的工作代码:

function checkValidUsers(validUsers) {
    var validIds = validUsers.map(function (user) { return user.id; });

    return function (users) {
        var ids = users.map(function (user) { return user.id; });
        return ids.every(function (id) { return ~validIds.indexOf(id); });
    };
}

var check = checkValidUsers([
    { id: 1 }, { id: 2 }, { id: 3 }
]);

check([{ id: 2 }, { id: 3 }]); 

答案 2 :(得分:1)

如果你想在中使用,你需要改变一下 validIds

var validIds = validUsers.reduce(function (acc,user) {  
    acc[user.id]=true; 
    return acc; 
},{});

function checkValidUsers(validUsers) {
    var validIds = validUsers.reduce(function (acc,user) {  acc[user.id]=true; return acc; },{});

    return function (users) {
        var ids = users.map(function (user) { return user.id; });
        return ids.every(function (id) { return id in validIds; });
    }
}

var check = checkValidUsers([
    { id: 1 }, { id: 2 }, { id: 3 }]);

document.getElementById('res').innerHTML = check([{ id: 2 }, { id: 3 }]); 
      
      
<div id="res"></div>