Получить некоторые данные из вложенного объекта - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть этот вложенный объект (json):

const json = {
  "application": {
    "App1": {
      "cats": [
        1
      ]
    },
    "App2": {
      "cats": [
        3
      ]
    },
    "App3": {
      "cats": [
        1,
        2
      ]
    }
  },
  "categories": {
    "1": {
      "name": "FirstCategory"
    },
    "2": {
      "name": "SecondCategory"
    },
    "3": {
      "name": "ThirdCategory"
    }
  }
};

Этот объект имеет два основных свойства: application и categories.

Я хочу отобразить массив application cats и получить свойство name каждого элемента массива cats.

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

{
   "App1": "FirstCategory",
   "App2": "ThirdCategory",
   "App3": "FirstCategory, ThirdCategory"
}

Я пытался использовать функцию map, но основная трудность заключается в том, что внутри applicaiton свойство cats является массивом (может иметь несколько значений). Таким образом, код ниже не работает:

Object.values(json.application).map(val => {
    Object.keys(json.categories).map(key => {
       //print something
    });
});

Ответы [ 3 ]

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

Вы можете использовать Array.reduce для элегантного решения.

const json = {
  "application": {
    "App1": {
      "cats": [
        1
      ]
    },
    "App2": {
      "cats": [
        3
      ]
    },
    "App3": {
      "cats": [
        1,
        2
      ]
    }
  },
  "categories": {
    "1": {
      "name": "FirstCategory"
    },
    "2": {
      "name": "SecondCategory"
    },
    "3": {
      "name": "ThirdCategory"
    }
  }
};

//Getting Application object
const application = json.application

//Getting Categories object
const categories = json.categories

//initializing reduce with a blank object and pushing all the keys of the application object
//Looping over keys of application object
const requiredOutput = Object.keys(application).reduce((out, appKey) => {
    //Setting value based on categories name
    out[appKey] = application[appKey].cats.map(id => categories[id].name)
    return out
}, {})

console.log(requiredOutput)

PS: Вы можете сослаться этот гист для безопасного чтения из вложенного объекта.

1 голос
/ 03 апреля 2019
const result = Object.keys(json.application).reduce((a,key) => {
    a[key] = json.application[key].cats
        .map(cat => json.categories[cat].name)
        .join(", ")
    return a;
}, {})
  1. цикл по ключам приложения
  2. для каждого цикла ключей по автомобилю и для каждого возвращаемого значения строки кошки из категории
  3. присоединение к списку строк кошки
1 голос
/ 03 апреля 2019

Попробуйте с этим.

    for(let val in json.application){
      json.application[val] = json.application[val].cats.map(cat => json.categories[cat].name).join(",")
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...