代码之家  ›  专栏  ›  技术社区  ›  imanu

对嵌套json复杂数组排序

  •  1
  • imanu  · 技术社区  · 7 年前

    我搜索如何排序 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()
    
    5 回复  |  直到 7 年前
        1
  •  1
  •   Chirag Ravindra    7 年前

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

    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
  •  1
  •   Markus    7 年前

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

    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
  •  0
  •   Jonas Wilms    7 年前

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

      const sorted = Object.values(myObject).sort((a, b) => a.place.city.localeCompare(b.place.city));
    
        4
  •  0
  •   Andreas Storvik Strauman    7 年前

    如果你看 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
  •  0
  •   imanu    7 年前

    我意识到我必须处理的对象(从obcler 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
            }
          }
        }
    }