使用normalizr反应来规范化数据的问题

时间:2017-09-24 12:28:24

标签: javascript arrays reactjs normalize normalizr

我正在尝试使用normalizr规范化以下数据。我希望能够轻松提取位置对象。更具体地说,我希望将电影对象嵌套在位置对象

我的代码: 从ajax调用(results.data)中检索数据后,我想将其展平。

const location = await new schema.Entity(
  'locations',
  {},
  {
    idAttribute: '_id'
  }
);
const movie = await new schema.Entity(
  'movies',
  { locations: [location] },
  {
    idAttribute: '_id'
  }
);

const normalizedData1 = normalize(result.data, movie);

我想要规范化的数据:

[
  {
    _id: '59c7698d544d56b262e2187e',
    title: 'tomorrow never die',
    __v: 0,
    locations: [
      {
        address: 'lasselle strasse 12 39114 magdeburg',
        lng: '11.6571759',
        lat: '52.1229847',
        _id: '59c7698d544d56b262e21880'
      },
      {
        address: ' hindhede place 12 587852 singapore',
        lng: '103.7760416',
        lat: '1.3454118',
        _id: '59c7698d544d56b262e2187f'
      }
    ]
  },
  {
    _id: '59c76a87544d56b262e21881',
    title: 'today is the day',
    __v: 0,
    locations: [
      {
        address: '1 high street flemington 3031',
        lng: '144.933632',
        lat: '-37.784413',
        _id: '59c76a87544d56b262e21883'
      },
      {
        address: ' 18 rue benoit malon',
        lng: '2.3515209',
        lat: '48.8071822',
        _id: '59c76a87544d56b262e21882'
      }
    ]
  },
  {
    _id: '59c76aeca1429ab37e9d40bd',
    title: '3 days to go',
    __v: 0,
    locations: [
      {
        address: '35 Nasse Wenne Paderborn',
        lng: '8.7262077',
        lat: '51.73028189999999',
        _id: '59c76aeca1429ab37e9d40be'
      }
    ]
  },
  {
    _id: '59c76b6788e12ab3a6d90fea',
    title: 'X men',
    __v: 0,
    locations: [
      {
        address: '18 rue benoit malon sevres france',
        lng: '2.2042506',
        lat: '48.817549',
        _id: '59c76b6788e12ab3a6d90feb'
      }
    ]
  }
];

当前输出:

    {
      "entities": {
        "movies": {
          "undefined": {
            "0": {
              "_id": "59c7698d544d56b262e2187e",
              "title": "tomorrow never die",
              "__v": 0,
              "locations": [
                {
                  "address": "lasselle strasse 12 39114 magdeburg",
                  "lng": "11.6571759",
                  "lat": "52.1229847",
                  "_id": "59c7698d544d56b262e21880"
                },
                {
                  "address": " hindhede place 12 587852 singapore",
                  "lng": "103.7760416",
                  "lat": "1.3454118",
                  "_id": "59c7698d544d56b262e2187f"
                }
              ]
            },
            "1": {
              "_id": "59c76a87544d56b262e21881",
              "title": "today is the day",
              "__v": 0,
              "locations": [
                {
                  "address": "1 high street flemington 3031",
                  "lng": "144.933632",
                  "lat": "-37.784413",
                  "_id": "59c76a87544d56b262e21883"
                },
                {
                  "address": " 18 rue benoit malon",
                  "lng": "2.3515209",
                  "lat": "48.8071822",
                  "_id": "59c76a87544d56b262e21882"
                }
              ]
            },
            "2": {
              "_id": "59c76aeca1429ab37e9d40bd",
              "title": "3 days to go",
              "__v": 0,
              "locations": [
                {
                  "address": "35 Nasse Wenne Paderborn",
                  "lng": "8.7262077",
                  "lat": "51.73028189999999",
                  "_id": "59c76aeca1429ab37e9d40be"
                }
              ]
            },
            "3": {
              "_id": "59c76b6788e12ab3a6d90fea",
              "title": "X men",
              "__v": 0,
              "locations": [
                {
                  "address": "18 rue benoit malon sevres france",
                  "lng": "2.2042506",
                  "lat": "48.817549",
                  "_id": "59c76b6788e12ab3a6d90feb"
                }
              ]
            }
          }
        }
      }
    }

2 个答案:

答案 0 :(得分:1)

由于result.data是一个数组,因此您需要使模式也针对数组进行规范化。最简单的方法是调用normalize

const normalizedData1 = normalize(result.data, [ movie ]);

答案 1 :(得分:-1)

这就是我最终的结果

const location = await new schema.Entity(
  'locations',
  {},
  {
    idAttribute: '_id'
  }
);
const movie = await new schema.Entity(
  'movies',
  { locations: [location] },
  {
    idAttribute: '_id'
  }
);

const movieListSchema = [movie];

const normalizedData = normalize(result.data, movieListSchema);