1

尝试使用 Normalizr 规范化包含与父级相同类型的嵌套模式的我的有效负载时遇到一些问题

例如

{
  id: 123,
  sections:{
    section: [{
      id: 1,
      name: "test",
      sections: {
        section: {
          id: 125,
          name: "test125"
        }
      }
    }, {
      id: 2,
      name: "test2"
      sections: {
        section: [
          {
            id: 124,
            name: "test124"
          }
        ]
      }
    }, {
      id: 3,
      name: "test3"
    }]
  } 
}

在上面的 json 结构中,嵌套部分可以是一个对象,也可以是一个数组。

4

2 回答 2

4

我对嵌套评论有类似的问题。这是我解决它的方法:

export const comment = new schema.Entity("comment", {}, {
    idAttribute: "key"
})
comment.define({
    user: user,
    reactions: {
        data: [reaction]
    },
    children: [comment]
})


export const post = new schema.Entity("post", {
    user: user,
    files: [image],
    comments: {
        data: [comment]
    },
    reactions: {
        data: [reaction]
    }
}, {
    idAttribute: "key"
})

基本上,我comment在将其用于自己的实体定义之前将其定义为新实体。我像往常一样在构造函数中定义的其他模式(请参阅post模式以获取示例)。希望这可以帮助。

于 2018-01-16T08:14:07.793 回答
-1

这是一个jq过滤器,它将规范化数据:

def enumerate:
  if type=="array" then .[] else . end ;
def sectionids:
    [ .sections.section | enumerate | .id // empty | tostring ]
  | if .==[] then {} else {sections:.} end ;
def sections:
    {sections:{section:[.]}}
  | .. | .section? | enumerate | objects | del(.sections) + sectionids ;

{
  "result": .id,
  "entities": {
    "sections": (reduce sections as $s ({};.["\($s.id)"]=$s))
  }
}

示例运行(假设正确的 json 数据data.json和上述过滤器filter.jq

$ jq -M -f filter.jq data.json
{
  "result": 123,
  "entities": {
    "sections": {
      "123": {
        "id": 123,
        "sections": [
          "1",
          "2",
          "3"
        ]
      },
      "1": {
        "id": 1,
        "name": "test",
        "sections": [
          "125"
        ]
      },
      "2": {
        "id": 2,
        "name": "test2",
        "sections": [
          "124"
        ]
      },
      "3": {
        "id": 3,
        "name": "test3"
      },
      "125": {
        "id": 125,
        "name": "test125"
      },
      "124": {
        "id": 124,
        "name": "test124"
      }
    }
  }
}

在线尝试!

于 2017-10-22T17:54:01.910 回答