【问题标题】:Ignore the last element of a json忽略json的最后一个元素
【发布时间】:2017-09-25 19:46:30
【问题描述】:

我从 API 得到的 Json 结果如下

Json 结果:

"Issues": [{
    "Id": null,
    "Key": null,
    "Values": [{
        "Key": "Display Name",
        "Value": "Rya"
      },
      {
        "Key": "UserName",
        "Value": "RH"
      },
      {
        "Key": "Count",
        "Value": "350"
      }
    ]
  },
  {
    "Id": null,
    "Key": null,
    "Values": [{
        "Key": "Display Name",
        "Value": "Mike"
      },
      {
        "Key": "UserName",
        "Value": "ML"
      },
      {
        "Key": "Count",
        "Value": "90"
      }
    ]
  }
]

我通过以下方式进行了映射-

.Issues.map(o =>
  o.Values.reduce((acc, {
      Key,
      Value
    }) =>
    (acc[Key] = Value, acc), {}));

映射的结果如下-

{ "Display Name": 'Rya', "UserName" : "RH", value: 350 },
{ "Display Name": 'Mike', "UserName" : "ML", value: 90 }

期望的结果:

{ "Display Name": 'Rya', "UserName" : "RH" },
{ "Display Name": 'Mike', "UserName" : "ML"}

在我的要求中,我想忽略最后一个元素,如所需结果所示。

【问题讨论】:

    标签: json ecmascript-6 lodash


    【解决方案1】:

    一种解决方案是在 reduce 之前添加一个过滤器,以过滤掉具有不需要的 Count 属性的对象。

    .Issues.map(o =>
      o.Values
        .filter(({ Key }) => Key !== 'Count')
        .reduce((acc, {
          Key,
          Value
        }) =>
        (acc[Key] = Value, acc), {}));
    

    您也可以在缩减期间通过在Key === 'Count' 时不添加对象来内联过滤。

    注意:JS 对象中没有最后一个属性。它是一组属性,其实际顺序取决于实现且不可靠。例如,在不同的浏览器和平台上打印你的对象可以给出任何顺序,没有任何东西可以保证一致性。

    【讨论】:

      【解决方案2】:

      最简单的解决方案是map、slice和reduce的组合:

      json.Issues.map(b => 
          b.Values.slice(0, -1).reduce((c,d) => {
              c[d.Key] = d.Value;
              return c;
      }, {}));
      

      演示:

      let j = {
        "Issues": [{
            "Id": null,
            "Key": null,
            "Values": [{
                "Key": "Display Name",
                "Value": "Rya"
              },
              {
                "Key": "UserName",
                "Value": "RH"
              },
              {
                "Key": "Count",
                "Value": "350"
              }
            ]
          },
          {
            "Id": null,
            "Key": null,
            "Values": [{
                "Key": "Display Name",
                "Value": "Mike"
              },
              {
                "Key": "UserName",
                "Value": "ML"
              },
              {
                "Key": "Count",
                "Value": "90"
              }
            ]
          }
        ]
      };
      
      let r = j.Issues.map(b =>
        b.Values.slice(0, -1).reduce((c, d) => {
          c[d.Key] = d.Value;
          return c;
        }, {}));
      console.log(r);

      【讨论】:

        【解决方案3】:

        .Issues.map(o => o.Values.reduce((acc, {Key, Value}) => (Key !== 'Count') ? (acc[Key] = Value, acc) : acc, {}));

        完整代码:

        const j = {"Issues": [
                {
                    "Id": null,
                    "Key": null,
                    "Values": [
                        {
                            "Key": "Display Name",
                            "Value": "Rya"
                        },
                        {
                            "Key": "UserName",
                            "Value": "RH"
                        },
                        {
                            "Key": "Count",
                            "Value": "350"
                        }
                    ]
                },
                {
                    "Id": null,
                    "Key": null,
                    "Values": [
                        {
                            "Key": "Display Name",
                            "Value": "Mike"
                        },
                        {
                            "Key": "UserName",
                            "Value": "ML"
                        },
                        {
                            "Key": "Count",
                            "Value": "90"
                        }
                    ]
                }
            ]
            }
            
            const r = j.Issues.map(o => o.Values.reduce((acc, {Key, Value}) => (Key !== 'Count') ? (acc[Key] = Value, acc) : acc, {}));
            
            console.log(JSON.stringify(r, null, 2))

        【讨论】:

          【解决方案4】:

          请注意,在 reduce 方法中,该函数也被传递到当前索引中,并且正在调用数组 reduce。所以如果你想忽略数组的最后一个元素,你可以这样做:

          Issues.map(o => 
             o.Values.reduce((acc, {Key, Value}, idx, arry) => {
               if(idx < arry.length -1)
                   acc[Key] = Value;
               return acc;
             }, {}
          );
          

          【讨论】:

            【解决方案5】:

            无论数组中有多少项,要删除最后一个元素,我会喜欢这样的东西:

            let result = data.Issues.map(issue => {
                let temp = issue.Values;
                temp.splice(-1);
                return temp.reduce((acc, {Key, Value}) => (acc[Key] = Value, acc), {});
            });
            

            这里是a fiddle

            【讨论】:

              猜你喜欢
              • 2018-11-17
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-07-15
              • 2018-08-06
              • 1970-01-01
              相关资源
              最近更新 更多