Как объединить два объекта так, чтобы ключи из одной карты соответствовали значениям другого, без дополнительных ключей во втором, используя последнюю Javascript? - PullRequest
0 голосов
/ 30 января 2020

Объект A :

 let form= {
      first_name: "",
      last_name: "",
      avatar: ""
}

Объект B

 let profile {
      first_name: "John",
      last_name: "Doe",
      avatar: "https://image.cdn.com",
      ....100 other fields

}

В основном я должен получить:

newObject: {
      first_name: "John",
      last_name: "Doe",
      avatar: "https://image.cdn.com"
}

Без этих дополнительных элементов во втором объекте.

Я пробовал это, но он по-прежнему возвращает лишние ключи, которые мне не нужны:

let profile= {
      first_name: "John",
      last_name: "Doe",
      avatar: "https://image.cdn.com",
      key1: 1,
      key2: 2,
      key: 3,

}
let form= {
      first_name: "",
      last_name: "",
      avatar: ""
}

console.log(_.merge(form, profile));

Ответы [ 4 ]

2 голосов
/ 30 января 2020

Вы можете использовать Object.keys() и Array.reduce() для перебора объекта

let form = {
  first_name: "",
  last_name: "",
  avatar: ""
}

let profile = {
  first_name: "John",
  last_name: "Doe",
  avatar: "https://image.cdn.com",
  dummy: 'Dummy'
}

let newObject = Object.keys(form).reduce((acc, key) => {
  acc[key] = profile[key];
  return acc
}, {})

console.log(newObject)

ОБНОВЛЕНИЕ:

С помощью lodash вы можете сделать это следующим образом:

let form = {
  first_name: "",
  last_name: "",
  avatar: ""
}

let profile = {
  first_name: "John",
  last_name: "Doe",
  avatar: "https://image.cdn.com",
  dummy: 'Dummy'
}

let intersection = _.intersection(Object.keys(form), Object.keys(profile))

console.log(intersection);

intersection.forEach(key => form[key] = profile[key])

console.log(form);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>
2 голосов
/ 30 января 2020

Вы можете получить ключи от одного объекта, используя Object.keys(), затем .map() эти ключи к объекту, который использует ключ с карты в качестве ключа для объект и значение из другого объекта для данного ключа в качестве значения для объекта. Затем используйте Object.assign() для создания объекта из этого массива объектов:

const form = { first_name: "", last_name: "", avatar: "" };
const profile = { first_name: "John", last_name: "Doe", avatar: "https://image.cdn.com", foo: 1, bar: 2, foobar: 3 };

const lift = (o1, o2) => 
  Object.assign({}, ...Object.keys(o1).map(k => ({[k]: o2[k]})));

const res = lift(form, profile);
console.log(res);

Или, поскольку вы используете loda sh в вашем примере, вы можете использовать loda sh ' с _.pick() метод с _.keys() примерно так:

const form = { first_name: "", last_name: "", avatar: "" };
const profile = { first_name: "John", last_name: "Doe", avatar: "https://image.cdn.com", foo: 1, bar: 2, foobar: 3 };

const res = _.pick(profile, _.keys(form));
console.log(res);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>
1 голос
/ 30 января 2020

Вы можете использовать Object.assign() или оператор распространения ES6 для создания нового объекта

let profile= {
      first_name: "John",
      last_name: "Doe",
      avatar: "https://image.cdn.com",
      key1: 1,
      key2: 2,
      key: 3,

}
let form= {
      first_name: "",
      last_name: "",
      avatar: ""
}

let output = { ...form, ...profile };

console.log(output);

И если вы не хотите переопределять значения в исходном объекте, если значение не ложно / пусто, вы можете сделать что-то вроде

let profile= {
      first_name: "John",
      last_name: "Doe",
      avatar: "https://image.cdn.com",
      key1: 1,
      key2: 2,
      key: 3,

}
let form= {
      first_name: "Adam",
      last_name: "",
      avatar: ""
}

const output = Object.keys(form).reduce((prev, key) => {
  prev[key] = form[key] || profile[key];
  return prev;
}, {});

console.log(output);
0 голосов
/ 30 января 2020

Одним из простых решений является создание вашей собственной функции слияния (но для проверки вашей реальной потребности .. например, если в переменной формы атрибуты не пустые .. какое значение будет иметь преимущество? Но вы можете настроить мой пример, например,

function getOnlyExisting(aParam1, aParam2) {
    var vResult = Object.create(aParam1);
    for (var vAttributeName in aParam1) {
        if (aParam2.hasOwnProperty(vAttributeName)) {
            vResult[vAttributeName] = aParam2[vAttributeName];
        }
    }
    return vResult;
}

let profile = {
    first_name: "John",
    last_name: "Doe",
    avatar: "https://image.cdn.com",
    key1: 1,
    key2: 2,
    key: 3,

}
let form = {
    first_name: "",
    last_name: "",
    avatar: ""
}

console.log(getOnlyExisting(form, profile));
...