2015-09-11 2 views
0

Я хочу сортировать следующую информацию по строковому значению (а не по номеру ключа). Я могу преобразовать его в словарь и заказать по значению («AAA» и «CCC») в коде ниже ... теперь единственный вопрос: как преобразовать словарь в тот же формат ниже в функции parseJSON ? Я не могу изменить формат JSON, так что это не может быть и речи. Любые другие способы оцениваются. Я не могу переместить его в массив или что-то еще. Как указано в моем вопросе, формат JSON существует как есть, и я не могу его изменить.Как заказать элементы, возвращенные в формате JSON?

var studentCollection.Groups = $.parseJSON("{\"1000\":\"CCC\", \"1001\":\"AAA\"}"); 

    //Sorting the studentCollection.Groups dictionary. 
    //Even though the groups come back as valid/sorted JSON 
    //upon parsing the JSON, the groups sorting gets lost 
    var items = Object.keys(studentCollection.Groups).map(function (key) { 
     return [key, studentCollection.Groups[key]]; 
    }); 

    items.sort(function (first, second) { 

     if (first[1] < second[1]) 
      return -1; 
     if (first[1] > second[1]) 
      return 1; 
     return 0; 

    }); 
+2

вы спрашиваете как преобразовать ваш многомерный массив, хранящийся в 'items' обратно в объект? Почему вы заботитесь о заказе объекта? Свойства объекта не имеют значимого «упорядочения» по определению. –

+0

Возможный дубликат [Сортировка объекта JavaScript по значению свойства] (http://stackoverflow.com/questions/1069666/sorting-javascript-object-by-property-value) –

+0

Проблема в том, что если вы преобразуете отсортированный массив назад к объекту, поскольку объекты не имеют порядка, это было бы бесполезно. Поэтому либо стройте массив, либо создайте свой собственный строковый JSON. – Oriol

ответ

1

вы можете просто преобразовать значения объекта в массив, который вы будете сортировать, а затем снова назначить шаг за шагом к объекту:

var j = "{\"1000\":\"AAA\", \"1001\":\"ZZZ\"}"; 
    var o = JSON.parse(j); 

    var keys = Object.keys(o); 
    var values = []; 

    for(var i = 0; i < keys.length; i++) values.push(o[keys[i]]); 

    values.sort(); 

    for(var i = 0; i < values.length; i++) o[keys[i]] = values[i]; 

    alert(JSON.stringify(o)); 

UPDATE

так например выше не имеет базового порядка ключей, этот должен быть:

var j = "{\"1000\":\"AAA\", \"1002\":\"ZZZ\", \"1004\":\"DDD\", \"1003\":\"BBB\", \"1001\":\"YYY\"}"; 

    j = j.replace(/\"\d+\"\:/g, function myFunction(x){ return x.substring(0,1) + "_" + x.substring(1) }) 

    var o = JSON.parse(j); 

    var keys = Object.keys(o); 
    var values = []; 

    for(var i = 0; i < keys.length; i++) values.push(o[keys[i]]); 

    values.sort(); 

    for(var i = 0; i < values.length; i++) o[keys[i]] = values[i]; 

    var j = JSON.stringify(o) 

    j = j.replace(/\"\_\d+\"\:/g, function myFunction(x){ return x.substring(0,1) + x.substring(2) }) 

    alert(j); 

попробовать здесь: https://jsfiddle.net/pyqw8hvt/1/

идея добавить _ перед каждым целочисленным ключом, чтобы сделать его не целое, и таким образом избежать автоматической сортировки внутри проанализированного объект, а затем после stringifying объекта удаления добавленных _ внутри клавиша

+0

Можете ли вы объяснить, как 'JSON.stringify' определяет порядок свойств объектов? –

+0

почему? это только для преобразования «отсортированного» объекта обратно в JSON –

+0

Зачем ему это? Я спрашивал, как «JSON.stringify» выполняет итерации по свойствам объекта для сериализации. * edit: * Или, может быть, я ошибочно полагаю, что OP хочет получить JSON в качестве результата ... –

1

Я не знаю, если это лучший способ сделать это, вы должны были бы назвать JSON.stringify два раза, но это дает выход, который вы ищете:

var studentCollection = {}; 
studentCollection.Groups = $.parseJSON("{\"1000\":\"CCC\", \"1001\":\"AAA\"}"); 

var items = Object.keys(studentCollection.Groups).map(function (key) { 
    return [key, studentCollection.Groups[key]]; 
}); 

items.sort(function (first, second) { 
    if (first[1] < second[1]) 
     return -1; 
    if (first[1] > second[1]) 
     return 1; 
    return 0; 
}); 

result = JSON.stringify(JSON.stringify(toObject(items))) 
console.log(result); 
// outputs: "{\"1001\":\"AAA\",\"1000\":\"CCC\"}" 

// checking if ordering remains 
console.log($.parseJSON(result)); 
// outputs: {"1001":"AAA","1000":"CCC"} 

function toObject(arr) { 
    return arr.reduce(function(o, v, i) { 
     o[v[0]] = v[1]; 
     return o; 
    }, {}); 
} 
+0

Правильно, но когда я конвертирую обратно из JSON в объект, он теряет сортировку. –

+0

Он работал на моем конце, проверьте отредактированный андерсер. –

+0

Я сделал ваш отредактированный «$ .parseJSON (результат)», и он не сохраняет порядок для большого объекта, который у меня есть. Известно, что $ .parseJSON не сохраняет порядок строки JSON –

Смежные вопросы