объединить объекты по ключу и создать новое имя ключа - PullRequest
1 голос
/ 12 апреля 2019

У меня есть 2 объекта данных.

let continent = {
  "BD": "AS",
  "BE": "EU",
  "BF": "AF",
  "BG": "EU"
}

let capital = {
  "BD": "Dhaka",
  "BE": "Brussels",
  "BF": "Ouagadougou",
  "BG": "Sofia"
}

Я хочу объединить это так

{
  "BD": {
    "continent": "AS",
    "capital": "Dhaka",
  },
  "BE": {
    "continent": "EU",
    "capital": "Brussels",
  },
  "BF": {
    "continent": "AF",
    "capital": "Ouagadougou",
  },
  "BG": {
    "continent": "EU",
    "capital": "Sofia",
  }
}

Понятия не имею, как этого добиться.

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 12 апреля 2019

Вы можете объединить с функцией ниже, просто убедитесь, что имена ключей передаются в том же порядке, что и объекты. Вы можете объединить любое количество объектов с помощью метода ниже.

let continent = {
  "BD": "AS",
  "BE": "EU",
  "BF": "AF",
  "BG": "EU"
};

let capital = {
  "BD": "Dhaka",
  "BE": "Brussels",
  "BF": "Ouagadougou",
  "BG": "Sofia"
};

function merge() {
  const args = Array.from(arguments);
  const keys = args.filter(e => 'string' === typeof e);
  const objs = args.filter(e => 'object' === typeof e);
  return objs.reduce((a, b, i) => {
    Object.entries(b).forEach(([key, value]) => {
      if (! a[key]) {
        a[key] = {[keys[i]]: value}
      } else {
        a[key][keys[i]] = value;
      }
    });
    return a;
  }, {})
}

console.log(merge('continent', 'capital', continent, capital));

Может быть проще использовать без фильтрации arguments

function merge(keys, objects) {
  return objects.reduce((a, b, i) => {
    Object.entries(b).forEach(([key, value]) => {
      if (! a[key]) {
        a[key] = {[keys[i]]: value}
      } else {
        a[key][keys[i]] = value;
      }
    });
    return a;
  }, {})
}

console.log(merge(['continent', 'capital'], [continent, capital]));

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

function merge(data) {
  return data.reduce((a, b, i) => {
    const key = Object.keys(b)[0];
    Object.entries(b[key]).forEach(([k, v]) => {
      if (!a[k]) {
        a[k] = {[key]: v}
      } else {
        a[k][key] = v;
      }
    });
    return a;
  }, {})
}
console.log(merge([{continent}, {capital}]));
1 голос
/ 12 апреля 2019

Вы можете использовать Object.entries и карту

let continent = {"BD": "AS","BE": "EU","BF": "AF","BG": "EU"}

let capital = {"BD": "Dhaka","BE": "Brussels","BF": "Ouagadougou","BG": "Sofia"}


let op = Object.entries(continent).map(([key,continent])=>(
 { [key] :{
           continent,
           capital:capital[key]
          }
}))

console.log(op)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...