// Make hashtable of ids in B
var bIds = {}
b.forEach(function(obj){
bIds[obj.id] = obj;
});
// Return all elements in A, unless in B
return a.filter(function(obj){
return !(obj.id in bIds);
});
очень незначительное дополнение: если списки очень велики и вы хотите избежать фактора дополнительной памяти 2, вы могли бы хранить объекты в хэш-карте в первую очередь вместо использования списков, предполагая, что идентификаторы уникальны : a = {20:{etc:...}, 15:{etc:...}, 10:{etc:...}, 17:{etc:...}, 23:{etc:...}}
. Я бы лично сделал это. Альтернатива: во-вторых, javascript сортирует списки на месте, поэтому он не использует больше памяти. например a.sort((x,y)=>x.id-y.id)
Сортировка будет хуже, чем выше, потому что это O (N log (N)). Но если вам все равно пришлось сортировать, есть алгоритм O (N), который включает два отсортированных списка: а именно, вы рассматриваете оба списка вместе и многократно берете самый левый (наименьший) элемент из списков (то есть проверяете, затем увеличиваете указатель / закладка из списка, который вы взяли). Это похоже на сортировку слиянием, но с большей осторожностью, чтобы найти идентичные элементы ... и, может быть, противно кодировать. В-третьих, если списки являются устаревшим кодом, и вы хотите преобразовать его в хэш-карту без лишних затрат памяти, вы также можете делать это поэлементно, многократно выталкивая элементы из списков и в хеш-карты.