Ответ 1
// 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), который включает в себя два отсортированных списка: а именно, вы рассматриваете оба списка вместе и несколько раз берете самый левый (самый маленький) элемент из списков (который исследуется, а затем увеличивается указатель/закладку из списка, который вы взяли). Это похоже на сортировку слияния, но с немного большей осторожностью, чтобы найти одинаковые элементы... и, возможно, надоедливо кодировать. В-третьих, если списки представляют собой устаревший код, и вы хотите преобразовать его в хэш-карту без лишних издержек памяти, вы также можете делать это поэтапно, неоднократно вынимая элементы из списков и в хэш-карты.