Сокращение вложенного массива - PullRequest
1 голос
/ 09 октября 2019

Я получаю этот JSON из своего бэкэнда, и мне нужно определить количество «concrete_compressive_cylinder_100», где selected_up = false

concrete_samples (может быть несколько для каждого рабочего задания) может быть нулевым (ключвсегда присутствует)

sample_specimens (1 на concrete_sample) может быть нулевым (ключ всегда присутствует)

concrete_compressive_cylinder_100 (от 0 до 500 на sample_specimens)

{ 
   "uuid":"4ad7bfe1-48d6-488c-bfaf-33f7189a41d7",
   "org_workorder_id":1000,
   "concrete_samples":[ 
      { 
         "uuid":"776a8ccb-82fd-4a42-a6eb-8f286a4a9c0b",
         "workorder_uuid":"4ad7bfe1-48d6-488c-bfaf-33f7189a41d7",
         "org_sample_id":5001,
         "sample_specimens":{ 
            "concrete_compressive_cylinder_100":[ 
               { 
                  "uuid":"b9ef3a8a-2945-41e6-a34d-d90d1bd64819",
                  "sample_uuid":"776a8ccb-82fd-4a42-a6eb-8f286a4a9c0b",
                  "picked_up":true
               },
               { 
                  "uuid":"d43f15b3-2208-43de-8fff-8d237c6918f9",
                  "sample_uuid":"776a8ccb-82fd-4a42-a6eb-8f286a4a9c0b",
                  "picked_up":true
               },
               { 
                  "uuid":"472f832a-6f07-4af6-97ea-e6dc7b9b3799",
                  "sample_uuid":"776a8ccb-82fd-4a42-a6eb-8f286a4a9c0b",
                  "picked_up":true
               }
            ],
            "concrete_compressive_cylinder_200":[ 
                { 
                   "uuid":"d659d058-e4ec-4f72-9d73-9ea98295715a",
                   "sample_uuid":"776a8ccb-82fd-4a42-a6eb-8f286a4a9c0b",
                   "picked_up":true
                },
                { 
                   "uuid":"777372e0-3e58-4292-bae4-bec84dfe1402",
                   "sample_uuid":"776a8ccb-82fd-4a42-a6eb-8f286a4a9c0b",
                   "picked_up":true
                },
                { 
                   "uuid":"f63f7102-7673-4e71-97e5-2d85e0c1a93d",
                   "sample_uuid":"776a8ccb-82fd-4a42-a6eb-8f286a4a9c0b",
                   "picked_up":true
                }
             ]
         }
      },
      { 
         "uuid":"61138cf3-0c49-4495-8a89-533c0a6e50bc",
         "workorder_uuid":"4ad7bfe1-48d6-488c-bfaf-33f7189a41d7",
         "org_sample_id":5002,
         "sample_specimens":{ 
            "concrete_compressive_cylinder_100":null,
            "concrete_compressive_cylinder_200":null
         }
      }
   ]
}

Я имеюзашел так далеко, но на самом деле это не сработало, и теперь я больше сбит с толку, некоторые рекомендации будут великолепны

        const out = res.data.concrete_samples.reduce((acc, sample) => {
          const { sample_specimens } = sample;
          const concrete_compressive_cylinder_100 = Object.keys(sample_specimens)["concrete_compressive_cylinder_100"];

            const specimens = concrete_compressive_cylinder_100.map(obj => {
                obj.picked_up ? console.log("picked up") : console.log("Not pickedn up")
            });

        }, []);

Ответы [ 3 ]

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

Array.prototype.reduce принимает функцию, возвращаемое значение которой в конечном итоге возвращается из самого reduce. Функция передается каждому элементу массива вместе со значением, накопленным до сих пор. Например,

[1, 2, 3].reduce((accumulator, element) => accumulator + element)
// => 6

Вы также можете указать начальное значение, которое будет передано вашей функции как accumulator на первой итерации.

На базовом уровне, чтобы посчитать, какВо многих случаях появления объекта с определенным свойством с reduce, вы можете использовать что-то вроде этого:

let array = [
  { foo: 4 },
  { foo: 6 },
  { bar: 8 },
]

array.reduce((count, element) => {
  if (element.foo !== undefined) {
    return count + 1
  } else {
    return count
  }
}, 0)
// => 2

Расширяя это на ваш код (с удалением лишних данных), с вложенным reduce, чтобы получитьколичество цилиндров с желаемым свойством picked_up,

const data = {
  "concrete_samples":[ 
    {
      "sample_specimens":{ 
        "concrete_compressive_cylinder_100":[ 
          {
            "picked_up":true
          },
          {
             "picked_up":true
          },
          {
             "picked_up":true
          }
        ],
        "concrete_compressive_cylinder_200":[ 
          {
             "picked_up":true
          },
          {
             "picked_up":true
          },
          {
             "picked_up":true
          }
        ]
      }
    },
    {
      "sample_specimens":{ 
        "concrete_compressive_cylinder_100":null,
        "concrete_compressive_cylinder_200":null
      }
    }
  ]
}

const result = data.concrete_samples.reduce((count, sample) => {
  const cylinders = sample.sample_specimens.concrete_compressive_cylinder_100
  if (cylinders == null) {
    return count
  }
  const samplePickedUpCount = cylinders.reduce((pickedUpCount, cylinder) => {
    if (cylinder.picked_up) {
      return pickedUpCount + 1
    } else {
      return pickedUpCount
    }
  }, 0)
  return count + samplePickedUpCount
}, 0)

console.log(result)

Вы также можете использовать Array.prototype.filter, чтобы выполнить то же самое, получить массив цилиндров с желаемым свойством и получить длинуэтот массив.

0 голосов
/ 09 октября 2019

Проверить ноль> цикл> проверить ноль> цикл и счет не так ли?

function someFunc(json) {
  const { concrete_samples } = json;
  if (!concrete_samples) return;

  let numberOFAvailableCylinder100s = 0;
  const doSomethingWithCylinder = cylinder => {
    console.log(cylinder.uuid);
    numberOFAvailableCylinder100s += 1;
  }

  concrete_samples.forEach(concrete_sample => {
    const { sample_specimens } = concrete_sample;
    if (!sample_specimens) return;
    findAvailableCylinder100(sample_specimens, doSomethingWithCylinder);
  })

  console.log(`count: ${numberOFAvailableCylinder100s}`);
}

function findAvailableCylinder100(sample_specimens, callback) {
  const { concrete_compressive_cylinder_100 } = sample_specimens;
  if (!concrete_compressive_cylinder_100) return;
  concrete_compressive_cylinder_100.forEach(cylinder => {
    if (!cylinder.picked_up) callback(cylinder);
  });
}

someFunc(yourJSONObject);
0 голосов
/ 09 октября 2019

Если я правильно понимаю, вы хотели бы получить новый массив concrete_samples, в котором значения массивов вложенных sample_specimens объектов уменьшаются до количества элементов, для которых picked_up истинно - один подход к этому будеткак указано в следующем фрагменте:

const data={"uuid":"4ad7bfe1-48d6-488c-bfaf-33f7189a41d7","org_workorder_id":1000,"concrete_samples":[{"uuid":"776a8ccb-82fd-4a42-a6eb-8f286a4a9c0b","workorder_uuid":"4ad7bfe1-48d6-488c-bfaf-33f7189a41d7","org_sample_id":5001,"sample_specimens":{"concrete_compressive_cylinder_100":[{"uuid":"b9ef3a8a-2945-41e6-a34d-d90d1bd64819","sample_uuid":"776a8ccb-82fd-4a42-a6eb-8f286a4a9c0b","picked_up":true},{"uuid":"d43f15b3-2208-43de-8fff-8d237c6918f9","sample_uuid":"776a8ccb-82fd-4a42-a6eb-8f286a4a9c0b","picked_up":true},{"uuid":"472f832a-6f07-4af6-97ea-e6dc7b9b3799","sample_uuid":"776a8ccb-82fd-4a42-a6eb-8f286a4a9c0b","picked_up":true}],"concrete_compressive_cylinder_200":[{"uuid":"d659d058-e4ec-4f72-9d73-9ea98295715a","sample_uuid":"776a8ccb-82fd-4a42-a6eb-8f286a4a9c0b","picked_up":true},{"uuid":"777372e0-3e58-4292-bae4-bec84dfe1402","sample_uuid":"776a8ccb-82fd-4a42-a6eb-8f286a4a9c0b","picked_up":true},{"uuid":"f63f7102-7673-4e71-97e5-2d85e0c1a93d","sample_uuid":"776a8ccb-82fd-4a42-a6eb-8f286a4a9c0b","picked_up":true}]}},{"uuid":"61138cf3-0c49-4495-8a89-533c0a6e50bc","workorder_uuid":"4ad7bfe1-48d6-488c-bfaf-33f7189a41d7","org_sample_id":5002,"sample_specimens":{"concrete_compressive_cylinder_100":null,"concrete_compressive_cylinder_200":null}}]};

const concreteSamplesResult = data.concrete_samples.map(sample => {
  
  // Iterate each key/value entry of sample_specimens, and reduce to a new 
  // specimens object that contains counts of picked_up: true items in sub array
  const sample_specimens = Object
    .entries(sample.sample_specimens)
    .reduce((specimens, entry) => {
    
    // Calculate count of picked_up items for arr of this entry
    const [key, arr] = entry;
    const count = Array.isArray(arr) ? 
      arr.reduce((total, item) => (total + (item.picked_up ? 1 : 0)), 0) : 0;
    
    // Add count for entry key to newly reduced sample_specimen object
    return { ...specimens, [key] : count };
    
  },{})
  
  return { ...sample, sample_specimens };

});

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