【问题标题】:Sort nested json complex array对嵌套的 json 复杂数组进行排序
【发布时间】:2018-09-27 00:52:07
【问题描述】:

我搜索如何按place.city 这种对象的 id 进行排序。需要为第一个键保留 id……

{
    "123": {
        "place": {
            "city": "New York",
            "country": "USA" 
        },
        "person": {
            "name": "Bob",
            "age": 45
        }
    },
    "456": {
        "place": {
            "city": "Chicago",
            "country": "USA" 
        },
        "person": {
            "name": "Louis",
            "age": 34
        }
    },
    "789": {
        "place": {
            "city": "Dallas",
            "country": "USA" 
        },
        "person": {
            "name": "Kevin",
            "age": 27
        }
    }
}

我尝试了这样的某种功能,但预期的结果不在这里。

let result = _(myObject).map(function (value, key) {
    return _.defaults({ name: key }, value)
}).sortBy('city').value()

【问题讨论】:

    标签: javascript sorting object lodash


    【解决方案1】:

    您无法对对象进行排序。但是,您可以将对象转换为数组并对其进行排序。

    var data ={
      "123" : {
        "place": {
          "city": "New York",
          "country": "USA" 
        },
        "person": {
          "name": "Bob",
          "age": 45
        }
      },
      "456" : {
        "place": {
          "city": "Chicago",
          "country": "USA" 
        },
        "person": {
          "name": "Louis",
          "age": 34
        }
      },
      "789" : {
        "place": {
          "city": "Dallas",
          "country": "USA" 
        },
        "person": {
          "name": "Kevin",
          "age": 27
        }
      }
    };
    
    var sortedByPlace = _.sortBy(Object.keys(data).map(k => ({id:k, ...data[k]})), (d)=> d.place.city)
    
    console.log(sortedByPlace);
    <script src="https://cdn.jsdelivr.net/npm/lodash@4.17.5/lodash.min.js"></script>

    【讨论】:

      【解决方案2】:

      无法对对象进行排序,您需要将其设为列表。

      import { map, flow } from 'lodash'
      import { sortBy } from 'lodash/fp'
      
      cities => flow(
        map(places, (place, id) => { id, ...place }),
        sortBy('city'),
      )()
      

      如果您想要本地排序,您的第二个问题会提出问题(mh...)。那是

      import { mapValues } from 'lodash'
      import { sortBy } from 'lodash/fp'
      
      data => mapValues(data, sortBy('place.city'))
      

      【讨论】:

        【解决方案3】:

        您无法对对象进行排序。但是,您可以创建一个包含对象引用的排序数组:

          const sorted = Object.values(myObject).sort((a, b) => a.place.city.localeCompare(b.place.city));
        

        【讨论】:

        • 没错,这是一个聪明的解决方案。不适用于我在这里更新的对象,我在第一篇文章中错过了一点(id 也用于子对象)stackoverflow.com/a/49877763/4075544
        【解决方案4】:

        如果您查看this 的答案,以下应该可以工作

        var sort = function (prop, arr) {
            prop = prop.split('.');
            var len = prop.length;
        
            arr.sort(function (a, b) {
                var i = 0;
                while( i < len ) { a = a[prop[i]]; b = b[prop[i]]; i++; }
                if (a < b) {
                    return -1;
                } else if (a > b) {
                    return 1;
                } else {
                    return 0;
                }
            });
            return arr;
        };
        sort("place.city", myObject);
        

        【讨论】:

          【解决方案5】:

          我意识到我必须处理的对象(从一个晦涩的 API 获取)比我的第一个示例要复杂一些:/

          所以你很好地给出的回复不再起作用了……

          你看到这个新对象的微妙之处了吗?

          点停留按place.city排序

          {
              "123": {
                0: {
                  "place": {
                      "city": "New York",
                      "country": "USA" 
                  },
                  "person": {
                      "name": "Bob",
                      "age": 45
                  }
                },
                1: {
                  "place": {
                      "city": "New York",
                      "country": "USA" 
                  },
                  "person": {
                      "name": "James",
                      "age": 32
                  }
                }
              },
              "456": {
                0: {
                  "place": {
                      "city": "Chicago",
                      "country": "USA" 
                  },
                  "person": {
                      "name": "Louis",
                      "age": 34
                  }
                },
                1: {
                  "place": {
                      "city": "Chicago",
                      "country": "USA" 
                  },
                  "person": {
                      "name": "Christine",
                      "age": 65
                  }
                }
              },
              "789": {
                0: {
                  "place": {
                      "city": "Dallas",
                      "country": "USA" 
                  },
                  "person": {
                      "name": "Kevin",
                      "age": 27
                  }
                },
                1: {
                  "place": {
                      "city": "Dallas",
                      "country": "USA" 
                  },
                  "person": {
                      "name": "Robert",
                      "age": 55
                  }
                },
                2: {
                  "place": {
                      "city": "Dallas",
                      "country": "USA" 
                  },
                  "person": {
                      "name": "Danny",
                      "age": 62
                  }
                }
              }
          }
          

          【讨论】:

          • 请编辑你的问题,不要把它写成答案。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-07-02
          • 2019-05-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多