JSON.parse执行不需要的数据排序

时间:2016-08-29 19:16:22

标签: json sorting select

我从ajax调用返回了这个json对象(结果):

{
    "2": "Buenos Aires",
    "3": "Catamara",
    "16": "Chaco",
    "17": "Chubut",
    "1": "Ciudad Aut\u00f3noma de Buenos Aires",
    "4": "C\u00f3rdoba",
    "5": "Corrientes",
    "6": "Entre R\u00edos",
    "18": "Formosa",
    "7": "Jujuy",
    "21": "La Pampa",
    "9": "La Rioja",
    "8": "Mendoza",
    "19": "Misiones",
    "20": "Neuqu\u00e9n",
    "22": "R\u00edo Negro",
    "10": "Salta",
    "11": "San Juan",
    "12": "San Luis",
    "23": "Santa Cruz",
    "13": "Santa Fe",
    "14": "Santiago del Estero",
    "24": "Tierra del Fuego",
    "15": "Tucum\u00e1n"
}

如您所见,它按省份名称排序。

定义

时出现问题
var list = JSON.parse( result )

以填充选择标记。

但是列表变成了这个:

{1:“CiudadAutónomadeBuenos Aires”,2:“布宜诺斯艾利斯”,3:“Catamara”,4:“Córdoba”,5:“Corrientes”,6:“EntreRíos”,7:“Jujuy “,8:”门多萨“,9:”拉里奥哈“,10:”萨尔塔“......等等......

“list”现在包含按代码排序的数据...是否有办法使用与从ajax调用接收的信息完全一致地填充select标记?

1 个答案:

答案 0 :(得分:1)

当迭代表示整数的对象属性时,它们将按数字顺序返回。这个迭代顺序并不总是被定义,但是因为ES6已经被定义了。

如果要维护某个顺序,则需要将信息存储在数组中,而不是存储在普通对象中。

这是将您的对象转换为数组的ES6代码,并按城市名称排序,但如果您的服务器以这种方式返回它会更好:

var arr = Object.keys(obj)
                .map ( key => [key, obj[key]] )
                .sort ( (a, b) => a[1].localeCompare(b[1]) );

看到它在此代码段中运行:

var json = `{
    "2": "Buenos Aires",
    "3": "Catamara",
    "16": "Chaco",
    "17": "Chubut",
    "1": "Ciudad Aut\u00f3noma de Buenos Aires",
    "4": "C\u00f3rdoba",
    "5": "Corrientes",
    "6": "Entre R\u00edos",
    "18": "Formosa",
    "7": "Jujuy",
    "21": "La Pampa",
    "9": "La Rioja",
    "8": "Mendoza",
    "19": "Misiones",
    "20": "Neuqu\u00e9n",
    "22": "R\u00edo Negro",
    "10": "Salta",
    "11": "San Juan",
    "12": "San Luis",
    "23": "Santa Cruz",
    "13": "Santa Fe",
    "14": "Santiago del Estero",
    "24": "Tierra del Fuego",
    "15": "Tucum\u00e1n"
}`;

var obj = JSON.parse(json);

var arr = Object.keys(obj)
                .map ( key => [key, obj[key]] )
                .sort ( (a, b) => a[1].localeCompare(b[1]) );

console.log(JSON.stringify(arr, null, 2));