Расширенный фильтр и сокращение - PullRequest
0 голосов
/ 03 октября 2019

Я получаю этот JSON из своего API, я пытаюсь преобразовать его в пригодный для использования формат для моей формы (это будет список с флажком)

{
  "uuid": "daff25b9-1efa-4c25-904f-7bf08bf22ce6",
  "concrete_samples": [
    {
      "uuid": "bb5d9b79-9e6b-4c21-9c1c-4771ce06e433",
      "sample_datetime": "2019-10-03T12:11:00+10:00",
      "sample_specimens": {
        "concrete_compressive_cylinder_100": [
          {
            "uuid": "4a730dd7-7bdb-4671-9b28-9b107759f4c8",
            "sample_uuid": "bb5d9b79-9e6b-4c21-9c1c-4771ce06e433",
            "mould_number": "321"
          },
          {
            "uuid": "205e31dd-637e-4588-bfbe-25093ff2c0cc",
            "sample_uuid": "bb5d9b79-9e6b-4c21-9c1c-4771ce06e433",
            "mould_number": "322"
          },
          {
            "uuid": "c9f975a9-b152-4711-b103-bda63e6e9d0b",
            "sample_uuid": "bb5d9b79-9e6b-4c21-9c1c-4771ce06e433",
            "mould_number": "323"
          },
          {
            "uuid": "c88940e4-28aa-4e64-b6b9-854a67797a7c",
            "sample_uuid": "bb5d9b79-9e6b-4c21-9c1c-4771ce06e433",
            "mould_number": "324"
          }
        ]
      }
    }
  ]
}

формат, который я пытаюсьпреобразуйте это в следующее

[
{
  "type": "concrete_compressive_cylinder_100",
  "sample_datetime": "2019-10-03T12:11:00+10:00",
  "sample_uuid": "bb5d9b79-9e6b-4c21-9c1c-4771ce06e433",
  "mould_number": "321"
},
{
  "type": "concrete_compressive_cylinder_100",
  "sample_datetime": "2019-10-03T12:11:00+10:00",
  "sample_uuid": "205e31dd-637e-4588-bfbe-25093ff2c0cc",
  "mould_number": "322"
},
{
  "type": "concrete_compressive_cylinder_100",
  "sample_datetime": "2019-10-03T12:11:00+10:00",
  "sample_uuid": "c9f975a9-b152-4711-b103-bda63e6e9d0b",
  "mould_number": "323"
},
{
  "type": "concrete_compressive_cylinder_100",
  "sample_datetime": "2019-10-03T12:11:00+10:00",
  "sample_uuid": "c88940e4-28aa-4e64-b6b9-854a67797a7c",
  "mould_number": "324"
}]

Я был в тупике на этом в течение нескольких часов, и я просто не могу обернуться вокруг фильтрации и уменьшения этого. Если бы кто-то мог немного осветить путь, я уверен, что мог бы понять это. Может быть несколько concrete_samples, и concrete_compressive_cylinder_100 может иметь значение null. Кроме того, sample_specimens также может иметь значение null (если к образцу не прикреплено ни одного образца)

Я пробовал это ниже, но это просто дает мне массив всехключи

let TempArray = Object.keys(res.data);
TempArray.reduce(function(concreteCylinderArray, sampleDateTime, sampleUUID, mouldNumber) {
  // now access this values from apiResponse and start setting them as the argument variables I have wrote
  const sampleObject = { concreteCylinderArray, sampleDateTime, sampleUUID, mouldNumber };
  return [].push(sampleObject);
}, []);

Ответы [ 3 ]

1 голос
/ 03 октября 2019

reduce через concrete_samples захватывает время и тип, а затем map через массив specimens, возвращая новые объекты, содержащие все соответствующие свойства.

const data = {"uuid":"daff25b9-1efa-4c25-904f-7bf08bf22ce6","concrete_samples":[{"uuid":"bb5d9b79-9e6b-4c21-9c1c-4771ce06e433","sample_datetime":"2019-10-03T12:11:00+10:00","sample_specimens":{"concrete_compressive_cylinder_100":[{"uuid":"4a730dd7-7bdb-4671-9b28-9b107759f4c8","sample_uuid":"bb5d9b79-9e6b-4c21-9c1c-4771ce06e433","mould_number":"321"},{"uuid":"205e31dd-637e-4588-bfbe-25093ff2c0cc","sample_uuid":"bb5d9b79-9e6b-4c21-9c1c-4771ce06e433","mould_number":"322"},{"uuid":"c9f975a9-b152-4711-b103-bda63e6e9d0b","sample_uuid":"bb5d9b79-9e6b-4c21-9c1c-4771ce06e433","mould_number":"323"},{"uuid":"c88940e4-28aa-4e64-b6b9-854a67797a7c","sample_uuid":"bb5d9b79-9e6b-4c21-9c1c-4771ce06e433","mould_number":"324"}]}}]}

const out = data.concrete_samples.reduce((acc, sample) => {

  // Destructure the time and specimens array from the current sample
  const { sample_datetime, sample_specimens } = sample;

  // Use Object.keys to get the type
  // (always the first key assuming the data shape doesn't change)
  const type = Object.keys(sample_specimens)[0];

  // `map` over the specimens array, and combine the time and data
  // with the specimen-specific properties
  const specimens = sample_specimens[type].map((obj) => {
    const { sample_uuid, mould_number } = obj;
    return { sample_datetime, type, sample_uuid, mould_number };
  });

  // Concatenate that array to the accumulator
  // and return it
  return acc.concat(specimens);
}, []);

console.log(out)
0 голосов
/ 03 октября 2019

Я знаю, я опоздал, но кроме принятого ответа это может быть легко понятное решение.

const result = obj.concrete_samples.reduce((res, { sample_specimens }) => {
   let tempArray = Object.keys(sample_specimens);
   tempArray.forEach(key => {
      sample_specimens[key].forEach(data => {
         const sampleObject = {'type': key, "uuid": data.uuid,
            "sample_uuid": data.sample_uuid,
            "mould_number": data.mould_number};
          res.push(sampleObject);
      });
   });
   return res;
}, []);

console.log(result)
0 голосов
/ 03 октября 2019

Как насчет использования вложенных циклов forEach следующим образом.

function convertFormat(input) {
  var output = [];
  input['concrete_samples'].forEach(sample => {
    Object.keys(sample['sample_specimens']).forEach(key => {
      sample['sample_specimens'][key].forEach(specimen => {
        output.push({
          "type": key,
          "sample_datetime": sample['sample_datetime'],
          "sample_uuid": specimen['sample_uuid'],
          "mould_number": specimen['mould_number']
        });
      });
    });
  });
  return output;

}

var input = {
  "uuid": "daff25b9-1efa-4c25-904f-7bf08bf22ce6",
  "concrete_samples": [
    {
      "uuid": "bb5d9b79-9e6b-4c21-9c1c-4771ce06e433",
      "sample_datetime": "2019-10-03T12:11:00+10:00",
      "sample_specimens": {
        "concrete_compressive_cylinder_100": [
          {
            "uuid": "4a730dd7-7bdb-4671-9b28-9b107759f4c8",
            "sample_uuid": "bb5d9b79-9e6b-4c21-9c1c-4771ce06e433",
            "mould_number": "321"
          },
          {
            "uuid": "205e31dd-637e-4588-bfbe-25093ff2c0cc",
            "sample_uuid": "bb5d9b79-9e6b-4c21-9c1c-4771ce06e433",
            "mould_number": "322"
          },
          {
            "uuid": "c9f975a9-b152-4711-b103-bda63e6e9d0b",
            "sample_uuid": "bb5d9b79-9e6b-4c21-9c1c-4771ce06e433",
            "mould_number": "323"
          },
          {
            "uuid": "c88940e4-28aa-4e64-b6b9-854a67797a7c",
            "sample_uuid": "bb5d9b79-9e6b-4c21-9c1c-4771ce06e433",
            "mould_number": "324"
          }
        ]
      }
    }
  ]
};

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