Заполнить объект вспять - PullRequest
1 голос
/ 05 марта 2020

Итак, я пытаюсь построить функцию, которая перестраивает объект и возвращает почтенный способ, например:

Текущий объект:

{
    "child1": {
        "value": "firstvalue", "Key": "ID1"
    },
    "child2":
    {
        "value": "secondvalue", "Key": "ID2"
    },
    "child3":
    {
        "value": "thirdvalue", "Key": "ID1"
    },
}

Ожидаемый объект:

{
    "ID1": {
        "child1": "first value",
        "child3": "third value", 
    },
    "ID2": {
        "child2": "third value",
    },
}

Есть какой-нибудь чистый способ сделать это? Или я должен положить sh в массив? Я попытался поместить sh в массив, а затем упорядочить его, но всякий раз, когда я пытался собрать sh объект с таким же «ID1», он заменял его, пытался выполнить уменьшение и преобразование в массив, но все еще не понял Спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 05 марта 2020

Используйте forEach и создайте объект с уникальными ключами.

const reverse = data => {
  const res = {};
  Object.entries(data).forEach(
    ([child, obj]) =>
      (res[obj.Key] = Object.assign(res[obj.Key] || {}, { [child]: obj.value }))
  );
  return res;
};

const data = {
  child1: {
    value: "firstvalue",
    Key: "ID1"
  },
  child2: {
    value: "secondvalue",
    Key: "ID2"
  },
  child3: {
    value: "thirdvalue",
    Key: "ID1"
  }
};

console.log(reverse(data));
0 голосов
/ 05 марта 2020

Да, это вполне возможно:

const obj = {
    "child1": {
        "value": "firstvalue", "Key": "ID1"
    },
    "child2":
    {
        "value": "secondvalue", "Key": "ID2"
    },
    "child3":
    {
        "value": "thirdvalue", "Key": "ID1"
    },
};

const result = Object.entries(obj) // Get all key/value pairs in the source object.
  .reduce((result, [child, data]) => {
    result[data.Key] = result[data.Key] || {}; // Make sure result[data.Key] is an object.
    result[data.Key][child] = data.value;      // Assign the current entry's value to object.
    return result;
  }, {});
    
console.log(result)
...