Объединить конкретные объекты в один, используя es6?

1

Это, безусловно, самый распространенный вопрос, заданный в SO, однако, в целом, задаваемые вопросы относятся к объединению двух целых объектов.

В моем случае это совсем другое.

Предположим, мне дали:

const P1 = {
  "name"          : "Person1",
  "profession"    : "Student",
  "gender"        : "Male",
  "type"          : "Patient",
}

const E1 = {
  "age"           : "30",
  "dob"           : "20/12/1970",
  "address"       : "122 Harrow Street",
  "contactNumber" : "07473033312",
}

и я хочу объединить эти два, чтобы дать мне следующее:

const Result = {
  "name"          : "Person1",
  "type"          : "Patient",
  "age"           : "30",
  "dob"           : "20/12/1970",
}

Проблема в том, что я не хочу объединять два целых проекта. Я хочу объединить определенные реквизиты без циклов.

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

const data = [...P1,...E1]; ,

Но это объединяет оба, чего я не хочу.

  • 0
    где твоя конкретная проблема?
  • 0
    Я обновил свой вопрос @NinaScholz
Показать ещё 3 комментария
Теги:
ecmascript-6
object
merge

4 ответа

2
Лучший ответ
 const result = (({name, type}, {age, dob}) => ({name, type, age, dob}))(P1, P2);

Просто частично уничтожьте P1 и P2 и создайте новый объект.

  • 0
    Исключительно по моей вине. Ваш ответ приемлем. Однако как это можно применить, если бы у нас был массив объектов, а не только P1 и E1?
  • 0
    Я обновил свой вопрос для правильного примера.
Показать ещё 2 комментария
1

Вы можете использовать полный динамический подход, используя массив для требуемых свойств, а другой для объектов.

Затем создайте новый объект из найденных объектов.

var p1 = { name: "Person1", profession:"Student", gender:"Male", type:"Patient" },
    e1 = { age: "30", dob:"20/12/1970", address:"122 Harrow Street", contactNumber:"07473033312" },
    keys = ['name', 'profession', 'age', 'dob'],
    objects = [p1, e1],
    merged = Object.assign(...keys.map(k => ({ [k]: objects.find(o => k in o)[k] })));

console.log(merged);
  • 0
    Вы зацикливаетесь.
  • 1
    мне нравится зацикливание
Показать ещё 2 комментария
1

Поскольку вы ищете способ ES6, я бы сказал, что использование деконструкции - это путь:

const P1 = {
    "name"          : "Person1",
    "profession"    : "Student",
    "gender"        : "Male",
    "type"          : "Patient",
}

const E1 = {
    "age"           : "30",
    "dob"           : "20/12/1970",
    "address"       : "122 Harrow Street",
    "contactNumber" : "07473033312",
}

const { name, type } = P1;
const { age, dob } = E2;
const Result = { name, type, age, dob };
0

Если вы знаете, какие свойства должен иметь объединенный объект (в вашем случае name, type, age, dob)

Как определить их так:

const P1 = {
    "name"          : "Person1",
    "profession"    : "Student",
    "gender"        : "Male",
    "type"          : "Patient",
}

const E1 = {
    "age"           : "30",
    "dob"           : "20/12/1970",
    "address"       : "122 Harrow Street",
    "contactNumber" : "07473033312",
}

const Result = {
    "name"          : P1.name || E1.name,
    "type"          : P1.type || E1.type,
    "age"           : P1.age || E1.age,
    "dob"           : P1.dob || E1.dob,
}
  • 0
    Возможно ли сделать это динамически? В настоящее время я вижу, что мне придется самому создать объект Result и назначить статические ключи.
  • 0
    @ doe, как вы можете «динамически» решить, какие ключи входят в получившийся объект?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню