【问题标题】:Reducing nested array减少嵌套数组
【发布时间】:2019-10-09 01:54:36
【问题描述】:

我正在从我的后端接收这个 JSON,我需要计算出“concrete_compressive_cylinder_100”的数量,其中pick_up = false

concrete_samples(每个工单可以有多个)可以为 null(key 始终存在)

sample_specimens(每个concrete_sample 1 个)可以为空(密钥始终存在)

concrete_compressive_cylinder_100 (null to 500 per 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")
            });

        }, []);

【问题讨论】:

    标签: reactjs ecmascript-6


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

    【讨论】:

      【解决方案2】:

      如果我理解正确,您希望获得一个新的 concrete_samples 数组,其中嵌套 sample_specimens 对象的数组值减少到 picked_up 为真的项目数 - 一种方法是如以下 sn-p 中所述:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-11-20
          • 2018-01-12
          • 2018-05-30
          • 2019-12-21
          • 2020-02-07
          • 1970-01-01
          • 2020-07-19
          相关资源
          最近更新 更多