Постановка задачи:
Найти элемент, который отсутствует в массиве currentArray, который был в предыдущем массиве.
previousArray.filter(function(x) { // return elements in previousArray matching...
return !currentArray.includes(x); // "this element doesn't exist in currentArray"
})
(Это так же плохо, как изапись двух вложенных циклов for, т. е. времени O (N 2 ). Это может быть сделано более эффективным, если необходимо, путем создания временного объекта из currentArray
и использования его в качестве хеш-таблицы для O (1) запросы. Например:)
var inCurrent={}; currentArray.forEach(function(x){ inCurrent[x]=true });
Итак, у нас есть временная таблица поиска, например,
previousArray = [1,2,3]
currentArray = [2,3];
inCurrent == {2:true, 3:true};
Тогда функции не нужно повторно искать currentArray каждый разкоторый будет O (N) подэтапом;он может мгновенно проверить, находится ли он в currentArray за O (1) раз.Поскольку .filter
вызывается N раз, это приводит к общему времени O (N), а не O (N 2 ):
previousArray.filter(function(x) {
return !inCurrent[x]
})
В качестве альтернативы здесь используется цикл forстиль:
var inCurrent = {};
var removedElements = []
for(let x of currentArray)
inCurrent[x] = true;
for(let x of previousArray)
if(!inCurrent[x])
removedElements.push(x)
//break; // alternatively just break if exactly one missing element
console.log(`the missing elements are ${removedElements}`)
Или просто используйте современные структуры данных, которые делают код намного более очевидным:
var currentSet = new Set(currentArray);
return previousArray.filter(x => !currentSet.has(x))