Каков наиболее эффективный способ создания различий между двумя объектами JavaScript?

Я пытаюсь создать "патч" между двумя объектами в JavaScript, чтобы иметь только обновленные данные в одной переменной.

var patch = {};

var o = {
  id: 'p1',
  kind: 'product',
  title: 'ProductTitle',
  price: 100,
  stock: 10,
};

var n = {
  title: 'ProductTitleRenamed',
  price: 100,
  stock: 20,
};

var patchExpected = {
  title: 'ProductTitleRenamed',
  stock: 20,
};

Я пробовал несколько сценариев на jsperf с методами vanilla/lodash, и я не понимаю, почему последний такой медленный по сравнению с другими (думаю, это связано с доступом к строкам). Необработанная версия логически быстрее (со многими if), но она действительно многословна, знаете ли вы другое элегантное и производительное решение (использующее immutablejs, es6 map и т. Д.)?

Тестирование в Chrome 58.0.3029 / Mac OS X 10.12.4

1 - С циклом Лодаша на новых свойствах объекта (3 006 759 операций / с)

_.forEach(n, (value, key) => {
  if (value !== o[key]) {
    patch[key] = value;
  }
});

2 - Со многими if (17 873 849 операций в секунду)

if (!_.isUndefined(n.id) && o.id !== n.id) {
  patch.id = n.id;
}

if (!_.isUndefined(n.kind) && o.kind !== n.kind) {
  patch.kind = n.kind;
}

if (!_.isUndefined(n.title) && o.title !== n.title) {
  patch.title = n.title;
}

if (!_.isUndefined(n.price) && o.price !== n.price) {
  patch.price = n.price;
}

if (!_.isUndefined(n.stock) && o.stock !== n.stock) {
  patch.stock = n.stock;
}

3 - со многими, если используется утилита "isChanged" (15,146,180 операций / с)

function isChanged(n, o) {
  return !_.isUndefined(n) && o !== n;
}

if (isChanged(n.id, o.id)) {
  patch.id = n.id;
}

if (isChanged(n.kind, o.kind)) {
  patch.kind = n.kind;
}

if (isChanged(n.title, o.title)) {
  patch.title = n.title;
}

if (isChanged(n.price, o.price)) {
  patch.price = n.price;
}

if (isChanged(n.stock, o.stock)) {
  patch.stock = n.stock;
}

4 - С одной функцией сравнения (менее многословно) (4 360 005 операций в секунду)

function diff(field) {
  if (!_.isUndefined(n[field]) && o[field] !== n[field]) {
    patch[field] = n[field];
  }
}

diff('id');
diff('kind');
diff('title');
diff('price');
diff('stock');

https://jsperf.com/diff-patch

0 ответов

Другие вопросы по тегам