You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按place.city排序带ID键的嵌套JSON对象并保留顶层ID键

嘿,我来帮你搞定这个问题!你需要对以ID作为顶层键的嵌套JSON对象,按照每个对象里的place.city字段排序,同时保留这些顶层ID键对吧?下面给你具体的实现步骤和代码示例:

核心思路

因为原生的JSON对象(在JavaScript里是普通对象)本身没法直接排序,所以我们需要先把它转换成可排序的数组,排序后再转回对象,这样就能既保留顶层ID,又实现按城市排序的需求。

具体实现(以JavaScript为例)

假设你的原始JSON数据长这样:

{
  "123": {
    "name": "Alice",
    "place": {
      "city": "Paris",
      "country": "France"
    }
  },
  "456": {
    "name": "Bob",
    "place": {
      "city": "London",
      "country": "UK"
    }
  },
  "789": {
    "name": "Charlie",
    "place": {
      "city": "Berlin",
      "country": "Germany"
    }
  }
}

步骤1:把对象转换成键值对数组

用Object.entries()方法,将顶层ID和对应的子对象转换成数组形式,这样我们就能对它排序:

const originalData = {/* 你的原始数据 */};
const entries = Object.entries(originalData);
// 此时entries的结构是:[[id1, obj1], [id2, obj2], ...]

步骤2:按place.city字段排序

对这个数组使用sort()方法,比较每个子对象的place.city值。为了避免大小写影响排序结果,我们先把城市名转成小写:

const sortedEntries = entries.sort((a, b) => {
  const cityA = a[1].place.city.toLowerCase();
  const cityB = b[1].place.city.toLowerCase();
  // 用localeCompare处理字符串排序,支持多语言
  return cityA.localeCompare(cityB);
});

步骤3:转换回保留顶层ID的对象

用Object.fromEntries()把排序后的数组重新转换成对象,此时顶层ID会被保留,而且对象的键顺序就是按城市排序后的顺序:

const sortedData = Object.fromEntries(sortedEntries);

兼容旧环境的写法

如果你的运行环境不支持Object.fromEntries()(比如旧版浏览器),可以用循环手动构建对象:

let sortedData = {};
sortedEntries.forEach(([id, obj]) => {
  sortedData[id] = obj;
});

验证结果

运行上面的代码后,sortedData的结构会变成:

{
  "789": {
    "name": "Charlie",
    "place": {
      "city": "Berlin",
      "country": "Germany"
    }
  },
  "456": {
    "name": "Bob",
    "place": {
      "city": "London",
      "country": "UK"
    }
  },
  "123": {
    "name": "Alice",
    "place": {
      "city": "Paris",
      "country": "France"
    }
  }
}

可以看到,顶层ID被完整保留,同时对象是按照place.city的字母顺序排序的。


内容的提问来源于stack exchange,提问作者imanu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:12:53