Многоуровневые объекты - разрушительное слияние на основе ключей - PullRequest
3 голосов
/ 04 апреля 2019

У меня есть два объекта.В основном модель и данные ситуации.Не могу понять, как рекурсивно удалять элементы в объекте данных, которые были удалены из модели.

Первая - это модель:

var foo = {
  "title": "Enter title",
  "info": {
    "released": "Enter year",
    "runtime": "Enter time"
  }
}

Другая - это данные:

var bar = {
  "title": "Forrest Gump",
  "info": {
    "released": "1994",
    "runtime": "02:22",
    "awards": "3"
  }
  "genre": "Drama/Comedy-drama"
}

Я пытаюсь сделать общее сравнение между двумя объектами, которые бырезультат:

var bar = {
  "title": "Forrest Gump",
  "info": {
    "released": "1994",
    "runtime": "02:22"
  }
}

Любая помощь будет принята с благодарностью!

Супер бонус был бы, если бы он мог добавить ключи объекта + значения, которые существуют в проекте, но не вданные.У меня это работает отдельно, но это был бы хороший бонус!

Ответы [ 2 ]

3 голосов
/ 04 апреля 2019

Рекурсивная функция над Object.keys должна отлично работать:

var foo = {
  "title": "Enter title",
  "info": {
    "released": "Enter year",
    "runtime": "Enter time"
  }
};

var bar = {
  "title": "Forrest Gump",
  "info": {
    "released": "1994",
    "runtime": "02:22",
    "awards": "3"
  },
  "genre": "Drama/Comedy-drama"
}

function getBoth(base, data) {
  var result = {};
  Object.keys(base).forEach(key => {
    if (typeof base[key] == "object" && data[key]) {
      result[key] = getBoth(base[key], data[key]);
    } else if (data[key]) {
      result[key] = data[key];
    }
  });
  return result;
}

console.log(getBoth(foo, bar));
1 голос
/ 04 апреля 2019

Вы можете попробовать это так:

var foo = {
  "title": "Enter title",
  "info": {
    "released": "Enter year",
    "runtime": "Enter time"
  },
  "NOT_EXISTING_IN_DATA": "Test"
}

var bar = {
  "title": "Forrest Gump",
  "info": {
    "released": "1994",
    "runtime": "02:22",
    "awards": "3"
  },
  "genre": "Drama/Comedy-drama"
}



function isObj (a) {
  return a != null && a.constructor === Object;
}

function projectIntoSpec (spec, data) {
  return Object.keys(spec).reduce(function (acc, key) {
    if (data.hasOwnProperty(key)) {
      if (!isObj(data[key])) {
        // copy non-object values from data
        acc[key] = data[key];
        return acc;
      }
      // recursively copy object values
      acc[key] = projectIntoSpec(spec[key], data[key]);
    } else {
      // add things which are in the blueprint but not in the data
      acc[key] = spec[key];
    }
    return acc;
  }, {});
}



console.log(projectIntoSpec(foo, bar));

Создает копию ваших данных в соответствии со всем, что определено в «foo». Если он встречает ключ в «foo», которого нет в данных, он копирует значение из «foo».

...