Size: a a a

NodeUA - JavaScript and Node.js in Ukraine

2021 November 27

MS

Mike S in NodeUA - JavaScript and Node.js in Ukraine
Спасибо, смотрю 👍👍
источник

Т

Тёмыч in NodeUA - JavaScript and Node.js in Ukraine
а шо там, 17 ноду можно уже брать и юзать прям в проде?
источник

IK

Illya Klymov in NodeUA - JavaScript and Node.js in Ukraine
Зачем не Лтски нести в прод
источник

Т

Тёмыч in NodeUA - JavaScript and Node.js in Ukraine
та я и не несу...
источник
2021 November 28

MS

Mike S in NodeUA - JavaScript and Node.js in Ukraine
// _.isEqual(objA, objB),
Заменил на
       try {
         assert.deepStrictEqual(objA, objB);
         return true;
       } catch (e) {
         return false;
       }
Работает, но очень медненно - ждал выполение минут 15 и не дождался
через лодаш отрабатывает за 30 секунд
assert.deepStrictEqual делает много лишних движений - или я что-то не понял
источник

B

Bruto in NodeUA - JavaScript and Node.js in Ukraine
Зачем это делать? В чем ваша задача?
источник

MS

Mike S in NodeUA - JavaScript and Node.js in Ukraine
У меня задача проверить есть ли в массиве объектов А уникальные экземпляры, что не встречаются в массиве объектов В.
Объекты глубокие. Оба массива примерно по 10к единиц.
Асимптотика моей реализации квадратичная - это конечно галименько, но принципиально не влияет на проблему быстрого сравнения двух объектов (не по ссылке, а конкретно глубокий проход по всем парам ключ: значение)
источник

АП

Алексей Попов... in NodeUA - JavaScript and Node.js in Ukraine
А не проще ли будет строить хеш из содержимого объектов, и сравнивать потом хэши?
источник

MS

Mike S in NodeUA - JavaScript and Node.js in Ukraine
Это вариант, но хэши это если не ошибаюсь медленно и чтобы сортить нужно не только «первый слой объекта», а рекурсивно в глубину
источник

АП

Алексей Попов... in NodeUA - JavaScript and Node.js in Ukraine
А что медленнее, один раз обойти объект и построить хэш, или (частично) обходить его при каждом сравнении?
источник

MS

Mike S in NodeUA - JavaScript and Node.js in Ukraine
Я предполагаю что на моих данных медленнее обходить при каждом сравнении
Сейчас потестирую ваш вариант с хэшами
источник

Т

Тёмыч in NodeUA - JavaScript and Node.js in Ukraine
А что вы потом делаете с этими уникальными элементами? Какая конечная цель?
источник

MS

Mike S in NodeUA - JavaScript and Node.js in Ukraine
Добавляю в БД
источник

OS

Oleh Shubin in NodeUA - JavaScript and Node.js in Ukraine
а как много повторов в % соотношении, может проще делать insert if not exist?
источник

MS

Mike S in NodeUA - JavaScript and Node.js in Ukraine
Вот это решение работает прям отлично. Буст производительности - с 30-35 секунд до  2-3 секунды!!
Прилагаю код, может кому пригодится:

function sortObject(object) {
 if (typeof object != 'object' || object instanceof Array) return object;
 const keys = Object.keys(object);
 keys.sort();
 const newObject = {};
 for (let i = 0; i < keys.length; i++) {
   newObject[keys[i]] = sortObject(object[keys[i]]);
 }
 return newObject;
}

function getObjectHash(object) {
 return crypto
   .createHash('sha256')
   .update(v8.serialize(sortObject(object)))
   .digest('hex');
}

const arrayBHashSet = new Set();

 arrayB.forEach((objB) =>
   arrayBHashSet.add(getObjectHash(objB)),
 );

const uniqueOnlyArray = arrayA.filter(
   (objA) =>
     !arrayBHashSet.has(getObjectHash(objA)),
 );
источник

A

Alexander in NodeUA - JavaScript and Node.js in Ukraine
Хеш имеет смысл, если вы его например в базу сохраняете или у вас объектов много, а памяти мало. Если просто сравнить 2 объекта, то хеш лишний.

Второй момент - ваш sortObject ничего не сортирует. Хотите чтобы оно действительно было посортировано - делайте из объекта массив
источник

MS

Mike S in NodeUA - JavaScript and Node.js in Ukraine
В теории не сортирует, а на практике сортирует)))
источник

IK

Illya Klymov in NodeUA - JavaScript and Node.js in Ukraine
он ключи в объекте сортирует )
источник

A

Alexander in NodeUA - JavaScript and Node.js in Ukraine
Значит мало практики
источник

IK

Illya Klymov in NodeUA - JavaScript and Node.js in Ukraine
да нет, абсолютно рабочий код сортировки :)
источник