Явное переопределение объекта Javascript по умолчанию

BSD

У меня есть простой объект, который я бы хотел переопределить с другим, в случае, если некоторые из свойств не существуют в объекте, его следует взять из заданного по умолчанию объекта, могут быть значения по умолчанию = { name : 'Joe' , options : { цвет : 'зеленый' , даты : { от : новой даты , чтобы : новая Дата , } } } LY вложенными

Ниже приведен пример настроек по умолчанию = { name : 'David' , options : { color : 'purple' } } object

final = {
   name : 'David',
   options : {
      color : 'purple',
      dates : {
         from : new Date,
         to   : new Date,
      }
   }
}

Вот предоставленный объект

JSON.stringify / parse

Вот ожидаемый результат, комбинация между двумя ...

$.extend(true, {}, defaults,settings)

Есть ли простой способ достичь этого без использования каких-либо внешних библиотек? Я пробовал некоторые подходы ( settings/ итерации по объектам / и т. Д.), Но не смог получить чистое решение ... надеюсь, что oneliner

Любая помощь приветствуется...

javascript,performance,

1

Ответов: 4


2

Используйте это defaults. Обратите внимание на порядок переменной json. В этом случае settingsбудут отменены, если эти две переменные имеют один и тот же атрибут.function extend(a, b){ for (var key in b) { if (b.hasOwnProperty(key)) a[key] = b[key]; return a; } } } console.log(extend(defaults,settings));

Если вы смотрите на чистый ответ JS. Вот код.

shallow

2

Вот мой вклад.

Следует отметить, что код довольно длинный из-за характера копирования deepи Object.assign(defaults, settings)копирования объекта.

Использование date, объединит ваши объекты, но ваш How to deep merge instead of shallow merge?ключ будет удален, так как он выполняет мелкую копию объекта.

Ниже я использовал фрагмент, который я нашел jhildenbiddleпользователем, jhildenbiddleкоторый выполняет deepслияние объекта и immutable(не редактирует исходные массивы).


let defaults = {
  name: 'Joe',
  options: {
    color: 'green',
    dates: {
      from: new Date(),
      to: new Date(),
    }
  }
};

let settings = {
  name: 'David',
  options: {
    color: 'purple'
  }
};

function mergeDeep(...objects) {
  const isObject = obj => obj && typeof obj === 'object';

  return objects.reduce((prev, obj) => {
    Object.keys(obj).forEach(key => {
      const pVal = prev[key];
      const oVal = obj[key];

      if (Array.isArray(pVal) && Array.isArray(oVal)) {
        prev[key] = pVal.concat(...oVal);
      } else if (isObject(pVal) && isObject(oVal)) {
        prev[key] = mergeDeep(pVal, oVal);
      } else {
        prev[key] = oVal;
      }
    });

    return prev;
  }, {});
}

let final = mergeDeep(defaults, settings);

console.log(final);


1

Это может привести к тому, что вручную будет установлено каждое значение, если изменения по умолчанию изменены.

final = {
      name : settings.name ? settings.name : "Joe",
      options {
        color: settings.color ? settings.color : "green",
        dates: {
          from : settings.dates.from ? settings.dates.from : new Date,
          to: settings.dates.to ? settings.dates.to : new Date
        }
      }
    }

Это, вероятно, будет работать лучше всего:

var final = Object.assign({}, default, settings);

0

Вы можете взглянуть на Object.assign

final = Object.assign(defaults, settings) 
JavaScript, производительность,
Похожие вопросы