我有一个包含所有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;
有没有办法解决这个问题?
答案 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"])