减少嵌套数组

时间:2019-10-09 01:54:36

标签: reactjs ecmascript-6

我从后端接收到此JSON,我需要计算出“ concrete_compressive_cylinder_100”的数量,其中pickd_up = false

concrete_samples(每个工作订单可以是多个)可以为null(密钥始终存在)

sample_specimens(每个混凝土样品1个)可以为null(密钥始终存在)

concrete_compressive_cylinder_100(每个sample_specimens为null到500)

{ 
   "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 个答案:

答案 0 :(得分:1)

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完成相同的操作,获得具有所需属性的圆柱体数组,并获取该数组的长度。

答案 1 :(得分:0)

如果我理解正确,那么您想获得一个新的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);

答案 2 :(得分:0)

检查null>循环>检查null>循环并计数吗?

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);