2015-08-28 5 views
1

У меня есть массив, содержащий все идентификаторы и массив, содержащий все допустимые идентификаторы.
Я просто хочу получить недопустимые идентификаторы.Сравните массив с массивом объектов

Это может быть сделано для циклов, но если возможно, я хотел бы сделать это с использованием метода .filter(), чтобы он был коротким и, возможно, более прозрачным.

Проблема состоит в том, что массив, содержащий допустимые идентификаторы, выглядит много иначе, чем массив, содержащий все идентификаторы. Позвольте мне показать вам:

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

Есть ли способ исправить это?

+0

'x' уже объект с' _id'. И почему 'indexOf'? Вы сравниваете два числа в этой точке, вы можете использовать равенство значений '==='. – elclanrs

+0

О, я забыл упомянуть, что мои идентификаторы на самом деле являются строками. ... Я отредактировал это очень быстро. – Forivin

ответ

3

Если вы действительно настаиваете на том, чтобы не использовать for-loops, вы могли бы, но было бы лучше, поскольку это позволило бы вам коротко замыкать проверку, как только вы найдете совпадение.

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"] 
+0

Интересно, похоже, почти нет разницы во времени исполнения между вашим и Андреасом. http://jsfiddle.net/zgeL59jr/ – Forivin

+0

@Forivin Почему вы ожидаете, что он будет одним? Код почти идентичен. – Nit

+0

Ну, но они используют разные методы, и мы говорим миллион итераций. Я бы ожидал здесь своего рода победителя. Но это было довольно случайным, что было быстрее. Я имею в виду выполнение цикла for в массиве и выполнение forEach, массив может выглядеть довольно похоже, но я сомневаюсь, что они будут выполнять то же самое. – Forivin

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"]) 
Смежные вопросы