将数组与对象数组

时间:2015-08-28 08:31:28

标签: javascript arrays

我有一个包含所有id的数组和一个包含所有有效ID的数组 我只是想检索无效的ID。

显然可以通过for循环来完成,但是如果可能的话,我希望使用.filter()方法来保持简短并且可能更透明。

问题是包含有效ID的数组看起来与包含所有id的数组有很大不同。让我告诉你:



var allIds = ["1673","2456","8977","5467"];
var validIds = [ {_id: "2456"}, {_id: "5467"} ];

var invalidIds = []; //as non-associative array

invalidIds = allIds.filter(function(x) { return validIds[x]["_id"].indexOf(x) < 0 });

console.log(invalidIds); //Uncaught TypeError: Cannot read property '_id' of undefined
&#13;
&#13;
&#13;

有没有办法解决这个问题?

2 个答案:

答案 0 :(得分:3)

如果你真的坚持不使用for循环,你可以,但它会更好,因为它会让你在找到匹配后短路检查。

var allIds = ["1673","2456","8977","5467"];
var validIds = [ {_id: "2456"}, {_id: "5467"} ];
var invalidIds = allIds.filter(function (id) {
  return !validIds.reduce(function (contains, item) {
    return contains || (item._id === id);
  }, false);
}); //["1673", "8977"]

答案 1 :(得分:2)

Array.prototype.filter + Array.prototype.some

var allIds = ["1673", "2456", "8977", "5467"];
var validIds = [{_id: "2456"}, {_id: "5467"}];

var invalidIds = allIds.filter(function (id) {
    return !validIds.some(function (validId) {
        return validId._id === id;
    });
});

console.log(invalidIds); // ["1673", "8977"])
相关问题