按顺序获取JSON值并保持相应名称的顺序

Getting JSON values by order and keeping the corresponding names in order

本文关键字:顺序 获取 JSON      更新时间:2023-09-26

我目前有一些JSON数据,如下所示:

{"data": [
    {"student_id": "bobby", "solved": 19},
    {"student_id": "smith", "solved": 20}
]}

现在我正在做的是在for循环中将求解的值推送到一个名为newData的数组中,如下所示:

newData.push(data['data'][i].solved);

现在我使用以下函数按值排序:

newData.sort(function(a,b){
    return a-b;        
});

太好了,现在我有了一组有序的值。但是,我如何检索与我按顺序排序的这些值相对应的名称?如果我可以在两个数组中解析名称,但每个索引在原始JSON数据中都对应相同的索引,那就太好了。我想,一个包含对象和值排序的巨大数组也可以。

您可以先按solved键对数据进行排序,然后使用map()按排序顺序返回两个单独的结果数组。

var obj = {"data": [{"student_id": "bobby", "solved": 19}, {"student_id": "smith", "solved": 20}]}
var newData = obj.data.sort(function(a, b) {
  return b.solved - a.solved;
});
var numbers = newData.map(e => e.solved);
var names =  newData.map(e => e.student_id);
console.log(numbers);
console.log(names);

为什么不直接对实际对象进行排序?

json.data.sort(function(a, b) {
    return a.solved - b.solved;        
});

现在您有了一个排序的对象数组。如果你想要最低的学生,就用sorted[0].student_id。你可以在下面看到这是如何工作的:

var obj = {"data": [{"student_id": "bobby", "solved": 19}, {"student_id": "smith", "solved": 18}]};
             
console.log('Raw Data: ', obj.data);
var sorted = obj.data.sort(function(a,b){
    return a.solved-b.solved;
    });
console.log('Sorted: ', sorted);

您还可以使用"lodash"或"下划线"按"solved"对数据进行排序,只需一行代码:

var data = {"data": [{"student_id": "bobby", "solved": 19}, {"student_id": "smith", "solved": 20}]}
var sorted = _.sortBy(data["data"],['solved']);

参见https://lodash.com/docs#sortBy

要将所有数据排序并保存在一个数组中,您可以创建一个对象,并通过在for循环中执行以下操作将其放入数组:

    newData.push({
        student_id: data['data'][i].student_id,
        solved: data['data'][i].solved
    });

当你去排序时,你只需要改变排序功能:

    newData.sort(function(a,b){
        return a.solved - b.solved;        
    });

当您稍后访问数组而不是使用newData[3]时,只需将行更改为newData[3].solvednewData[3]['solved']即可。

将数据保存在这样的单个数组中将有助于使student_idsolved值更容易配对。当使用多个数组时,更容易使索引彼此不匹配。但没有什么能阻止你使用不止一个。

使用小型可重复使用的一行

const {data} = {"data": [
    {"student_id": "bobby", "solved": 19},
    {"student_id": "smith", "solved": 20}
]};
const sortBy = (by,arr) => arr.slice().sort((a,b) => b[by] - a[by]);
const getProp = (prop,obj) => obj[prop];
const sortById = sortBy.bind(null, 'student_id');
const sortBySolved = sortBy.bind(null, 'solved');
const getId = getProp.bind(null, 'student_id');
const getSolved = getProp.bind(null, 'solved');
const sortedIds = sortById(data).map(getId);
const sortedSolutions = sortBySolved(data).map(getSolved);
console.log(sortedIds);
console.log(sortedSolutions);