Как конвертировать массив? - PullRequest
0 голосов
/ 27 мая 2019

Мне нужно переформатировать массив из одного типа в другой, используя библиотеку "Lodash".

У меня изначально есть такой массив:

[{
    "language": {
      "displayName": {
        "en": "English"
      },
      "id": 1
    },
    "level": {
      "id": 1,
      "displayName": {
        "en": "Intermediate"
      }
    }
  }, {
    "language": {
      "displayName": {
        "en": "Russian"
      },
      "id": 2
    },
    "level": {
      "id": 1
      "displayName": {
        "en": "Fluent"
      }
    }
  }]

Как преобразовать массив в этот формат:

[{
    "language": 1, // it is language.id
    "level": 1 // it is level.id
  }, {
    "language": 2, // it is language.id
    "level": 2 // it is level.id
}]

Ответы [ 4 ]

0 голосов
/ 28 мая 2019

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

const arr = [{"language":{"displayName":{"en":"English"},"id":1},"level":{"id":1,"displayName":{"en":"Intermediate"}}},{"language":{"displayName":{"en":"Russian"},"id":2},"level":{"id":1,"displayName":{"en":"Fluent"}}}];
const res = arr.map(({ language: { id: language }, level: { id: level }}) => ({ language, level }));
console.log(res);
.as-console-wrapper { max-height: 100% !important; top: auto; }

Вот версия Lodash с использованием _.map и _.mapValues (чтобы избежать _.map из _.values, что является более многословным):

const arr = [{"language":{"displayName":{"en":"English"},"id":1},"level":{"id":1,"displayName":{"en":"Intermediate"}}},{"language":{"displayName":{"en":"Russian"},"id":2},"level":{"id":1,"displayName":{"en":"Fluent"}}}];
const res = _.map(arr, e => _.mapValues(e, ({ id }) => id));
console.log(res);
.as-console-wrapper { max-height: 100% !important; top: auto; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>
0 голосов
/ 27 мая 2019

Вы можете использовать map . В функции обратного вызова карты вы можете получить доступ к отдельному объекту, и каждый объект будет иметь language & level в качестве ключа. Ключ id вложен в язык и ключ уровня. Таким образом, чтобы получить значение id, вам нужно item.language.id & item.level.id, где item является текущим объектом

let data = [{
  "language": {
    "displayName": {
      "en": "English"
    },
    "id": 1
  },
  "level": {
    "id": 1,
    "displayName": {
      "en": "Intermediate"
    }
  }
}, {
  "language": {
    "displayName": {
      "en": "Russian"
    },
    "id": 2
  },
  "level": {
    "id": 1,
    "displayName": {
      "en": "Fluent"
    }
  }
}];


let newData = data.map(function(item) {
  return {
    language: item.language.id,
    level: item.level.id
  }

});

console.log(newData)
0 голосов
/ 27 мая 2019

Вы можете использовать Array.map(), как уже показано. Однако для решения Lodash по требованию будет использоваться _. Map () в сочетании с _. MapValues ​​()

const input = [{"language":{"displayName":{"en":"English"},"id":1},"level":{"id":1,"displayName":{"en":"Intermediate"}}},{"language":{"displayName":{"en":"Russian"},"id":2},"level":{"id":2,"displayName":{"en":"Fluent"}}}];

let res = _.map(input, o => _.mapValues(o, "id"));

console.log(res);
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
0 голосов
/ 27 мая 2019

Вы можете использовать map так:

const input=[{language:{displayName:{en:"English"},id:1},level:{id:1,displayName:{en:"Intermediate"}}},{language:{displayName:{en:"Russian"},id:2},level:{id:1,displayName:{en:"Fluent"}}}];

const output = input.map(o => ({ language: o.language.id, level: o.level.id }))

console.log(output)
...