【问题标题】:How to sort JSON into an array based on a child property如何根据子属性将 JSON 排序到数组中
【发布时间】:2017-08-07 17:40:23
【问题描述】:

我有一个 RESTful 调用,它返回类似于以下内容的数据:

[{
  name: "one",
  dayID: "Tuesday},
 {
   name: "two",
   dayID: "Monday"
 },
 {
   name: 'three'
   dayID: "Tuesday
 }]

我要做的是遍历数据并创建一个新数组,该数组具有基于唯一属性的嵌套结构。因此,如果数组已经有星期一,则将 json 推送到该对象。如果没有,请制作一个新的。在这种情况下,将所有对象嵌套在 day 下,因此新数组如下所示:

[{"Monday":["two"]}, {"Tuesday":["one", "three"]}] 

这些在实践中不会是字符串,它们将是附加对象,但为了简单起见,我在示例中要求使用字符串。任何帮助表示赞赏。

【问题讨论】:

  • 显示您尝试过的内容。这个网站上有很多很多类似的问题。这里的目标不是为您编写代码,而是帮助您修复您的代码
  • 我还没有尝试过,我想看看人们会如何处理这个问题。
  • 通过使用Array.reduce -> jsfiddle.net/thgvvm05

标签: javascript arrays json object for-loop


【解决方案1】:

你可以只返回对象而不是数组,因为键是唯一的。

var data = [{
  name: "one",
  dayID: "Tuesday"
}, {
  name: "two",
  dayID: "Monday"
}, {
  name: 'three',
  dayID: "Tuesday"
}]

var result = data.reduce(function(r, e) {
  if (!r[e.dayID]) r[e.dayID] = [e.name];
  else r[e.dayID].push(e.name);
  return r;
}, {})

console.log(result)

【讨论】:

    【解决方案2】:

    将 Array#reduce 与辅助对象一起使用:

    var arr = [{
        name: "one",
        dayID: "Tuesday"
      },
      {
        name: "two",
        dayID: "Monday"
      },
      {
        name: 'three',
        dayID: "Tuesday"
      }
    ];
    
    
    var helperObj = {};
    var result = arr.reduce(function(r, o) {
      if(!helperObj[o.dayID]) {
        helperObj[o.dayID] = [];
        r.push({ [o.dayID]: helperObj[o.dayID] });
      }
      
      helperObj[o.dayID].push(o.name);
    
      return r;
    }, []);
    
    console.log(result);

    【讨论】:

      【解决方案3】:

      您可以使用Array.reduce 将您的数组更新为所需的格式。

      您只需要根据条件不断更新accumulating array acc。

      var data = [{
        name: "one",
        dayID: "Tuesday"},
       {
         name: "two",
         dayID: "Monday"
       },
       {
         name: 'three',
         dayID: "Tuesday"
       }];
       
       data = data.reduce((acc, cur) => {
        if(acc.some(a => a[cur.dayID])) {
          acc.forEach(a => {
             if(a[cur.dayID]) {
               a[cur.dayID].push(cur.name)
             }
          });
        } else {
          var obj = {};
          obj[cur.dayID] = [cur.name];
          acc.push(obj);
        }
        return acc;
       }, []);
       
       console.log(data);

      【讨论】:

        猜你喜欢
        • 2014-08-21
        • 2018-11-28
        • 2015-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-05
        • 1970-01-01
        相关资源
        最近更新 更多