Извлечение элементов из файла JSON со значениями в массиве - PullRequest
0 голосов
/ 12 июня 2019

Я пытаюсь обработать массивы JSON для извлечения пары ключ-значение из ключей, доступных для выбора пользователя.

Это не пример реального времени JSON ... Это просто пример

Пример JSON

var personnel = [
  {
    id: 5,
    name: "Luke Skywalker",
    pilotingScore: 98,
    shootingScore: 56,
    isForceUser: true,
  },
  {
    id: 82,
    name: "Sabine Wren",
    pilotingScore: 73,
    shootingScore: 99,
    isForceUser: false,
    skills:{
      'skill1':'vision',
      'skill2':'strength'  
    }
  },
  {
    id: 22,
    name: "Zeb Orellios",
    pilotingScore: 20,
    shootingScore: 59,
    isForceUser: false,
  },
  {
    id: 15,
    name: "Ezra Bridger",
    pilotingScore: 43,
    shootingScore: 67,
    isForceUser: true,
    skills:{
      'skill1':'vision',
      'skill2':'strength'
    }
  },
  {
    id: 11,
    name: "Caleb Dume",
    pilotingScore: 71,
    shootingScore: 85,
    isForceUser: true,
  },
];




      sample_arr = [id,name,skills.skill1];

      let op = personnel.map(md => {
             return { id: md.id,name:md.name,skills{skill1:md.skills.skill1}};
       });

         console.log(JSON.stringify(op,null,2))

Я хотел получить пару ключ-значение, как показано ниже.

[
  {
    "id": 5,
    "name": "Luke Skywalker"
  },
  {
    "id": 82,
    "name": "Sabine Wren",
     "skills":{
         "skill1": 'vision'
       }
  },
  {
    "id": 22,
    "name": "Zeb Orellios"
  },
  {
    "id": 15,
    "name": "Ezra Bridger"
  },
  {
    "id": 11,
    "name": "Caleb Dume"
  }
]

Я обновил формулировку своей проблемы.

Требования:

Извлечение всех значений JSON, выбранных пользователем, в новый массив. Это сэкономит больше времени, так как размер json составляет 700 МБ, а обработка каждого запроса занимает много времени

Ответы [ 4 ]

1 голос
/ 12 июня 2019

Вот простая функция для этого:

const project = (keys) => (xs) =>
  xs .map (x => keys .reduce ( (a, k) => ({...a, [k]: x[k]}), {} ))

var personnel = [{id:5,name:"Luke Skywalker",pilotingScore:98,shootingScore:56,isForceUser:true},{id:82,name:"Sabine Wren",pilotingScore:73,shootingScore:99,isForceUser:false,skills:{skill1:"vision",skill2:"strength"}},{id:22,name:"Zeb Orellios",pilotingScore:20,shootingScore:59,isForceUser:false},{id:15,name:"Ezra Bridger",pilotingScore:43,shootingScore:67,isForceUser:true,skills:{skill1:"vision",skill2:"strength"}},{id:11,name:"Caleb Dume",pilotingScore:71,shootingScore:85,isForceUser:true}];

console .log (
  project (['id', 'name']) (personnel)
)

Имя project взято из ранних работ Кодда по реляционным базам данных;По своему ощущению он похож на оператор select в SQL.

Обновление

Ответ от KellyKapoor имеет одну особенность, которой выше не хватает: он включает в себя имя свойства, только если оно есть у данных (поэтому нет skills: undefined.)

Не ясно, какое поведение ищет ОП, но эта небольшая модификация предлагает эту функцию

const project2 = (keys) => (xs) =>
  xs .map (x => keys .reduce ((a, k) => ({...a, ...(k in x ? {[k]: x[k]} : {}) }), {} ))

var personnel = [{id:5,name:"Luke Skywalker",pilotingScore:98,shootingScore:56,isForceUser:true},{id:82,name:"Sabine Wren",pilotingScore:73,shootingScore:99,isForceUser:false,skills:{skill1:"vision",skill2:"strength"}},{id:22,name:"Zeb Orellios",pilotingScore:20,shootingScore:59,isForceUser:false},{id:15,name:"Ezra Bridger",pilotingScore:43,shootingScore:67,isForceUser:true,skills:{skill1:"vision",skill2:"strength"}},{id:11,name:"Caleb Dume",pilotingScore:71,shootingScore:85,isForceUser:true}];

console .log (
  project2 (['id', 'name', 'skills']) (personnel)
)
1 голос
/ 12 июня 2019

У вас есть пользовательские выборы, хранящиеся в массиве?Если это так, вы можете сделать что-то вроде:

let sample_arr = ['id', 'name']

let op = personnel.map(md => {
    let user = {}
    sample_arr.forEach(val => {
        if (md[val]) {
            user[val] = md[val]
        }
    })
    return user
})
0 голосов
/ 12 июня 2019

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

var data = [ { id: 5, name: "Luke Skywalker", pilotingScore: 98, shootingScore: 56, isForceUser: true, }, { id: 82, name: "Sabine Wren", pilotingScore: 73, shootingScore: 99, isForceUser: false, skills:{ 'skill1':'vision', 'skill2':'strength' } }, { id: 22, name: "Zeb Orellios", pilotingScore: 20, shootingScore: 59, isForceUser: false, }, { id: 15, name: "Ezra Bridger", pilotingScore: 43, shootingScore: 67, isForceUser: true, skills:{ 'skill1':'vision', 'skill2':'strength' } }, { id: 11, name: "Caleb Dume", pilotingScore: 71, shootingScore: 85, isForceUser: true, }, ];

let pick = (obj, fields) => Object.keys(obj)
  .reduce((r,c) => (fields.includes(c) ? r[c] = obj[c] : null, r), {})

let result = data.map(x => pick(x, ['id', 'name', 'skills']))

console.log(result)

Тогда все, что вам нужно, это выполнить цикл через Array.map для pick из всех объектов.

0 голосов
/ 12 июня 2019

В чем проблема с этим?

let op = personnel.map(md => {
   return { id: md.id,name:md.name};
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...