【问题标题】:Normalizr - normalize array of objects with nested arrayNormalizr - 使用嵌套数组规范化对象数组
【发布时间】:2018-11-26 00:56:39
【问题描述】:

无法理解要使用哪些架构定义...

使用什么模式定义来规范化这些数据:

[
      {
        manufacturer: "Foo",
        car: ["Foo-s1", "Foo-s2"]
      },
      {
        manufacturer: "Bar",
        car: ["Bar-c3", "Bar-c4"]
      }
]

到这个形状:

entities: {
  manufacturers: {
    Foo: {
           id: Foo,
           cars: ["Foo-s1", "Foo-s2"]  
    },
    Bar: {
           id: Bar,
           cars: ["Bar-c3", "Bar-c4"]
    }
  },
  cars: {
     "Foo-s1": {
                 id: "Foo-s1",
     },
     //...etc
  }
};

【问题讨论】:

    标签: normalizr


    【解决方案1】:

    您可以尝试这样的方法,但是您需要对原始输入执行一些数据转换。可能有更好的解决方案,这是我想出的。

    import { normalize, schema } from 'normalizr';
    
    const originalData = [
      {
        id: "1",
        manufacturer: "Foo",
        car: ["Foo-s1", "Foo-s2"],
      },
      {
        id: "2",
        manufacturer: "Bar",
        car: ["Bar-c3", "Bar-c4"],
      }
    ];
    
    const objectData = originalData.reduce((prev, curr) => {
      const updatedData = Object.entries(curr).reduce((obj, [k,v]) => {
        if(v.constructor === String && k !== 'id')
          return Object.assign({}, obj, {[k]: {'id': v}});
        if(v.constructor === Array) {
          const arrayData = v.reduce((vPrev, vCurr) => vPrev.concat({'id': vCurr}), []);
          return Object.assign({}, obj, {[k]: arrayData});
        }
        return Object.assign({}, obj, {[k]: v});
      }, {});
      return prev.concat(updatedData);
    }, []);
    
    const manufacturer = new schema.Entity('manufacturers');
    const car = new schema.Entity('cars');
    const manufactorData =  new schema.Entity('manufactorData', {
      manufacturer: manufacturer,
      car: [car]
    });
    
    const normalizedData = normalize(objectData, [manufactorData]);
    
    console.log('Original Data: ', originalData);
    console.log('ObjectData: ', objectData);
    console.log('Normalized Data: ', normalizedData);

    最终结果如下所示:

    {
      "entities": {
        "manufacturers": {
          "Foo": {
            "id": "Foo"
          },
          "Bar": {
            "id": "Bar"
          }
        },
        "cars": {
          "Foo-s1": {
            "id": "Foo-s1"
          },
          "Foo-s2": {
            "id": "Foo-s2"
          },
          "Bar-c3": {
            "id": "Bar-c3"
          },
          "Bar-c4": {
            "id": "Bar-c4"
          }
        },
        "manufactorData": {
          "1": {
            "id": "1",
            "manufacturer": "Foo",
            "car": [
              "Foo-s1",
              "Foo-s2"
            ]
          },
          "2": {
            "id": "2",
            "manufacturer": "Bar",
            "car": [
              "Bar-c3",
              "Bar-c4"
            ]
          }
        }
      },
      "result": [
        "1",
        "2"
      ]
    }

    【讨论】:

      猜你喜欢
      • 2018-05-23
      • 2016-06-21
      • 2018-05-27
      • 2018-04-09
      • 2016-11-15
      • 2021-05-22
      • 2021-08-11
      • 2019-10-03
      • 2021-03-19
      相关资源
      最近更新 更多