2015-06-12 4 views
4

У меня есть локальное хранилище, которое выглядит следующим образом:Сортировка объекта по массиву внутри массива?

Key: Savedme   
Value: 
{ 
"Bob":["1","1"], 
"John":["2","1"], 
"Mom":["3","1"], 
"Dad":["1","2"], 
"Tom":["3","2"], 
"Skipper42":["2","3"], 
"Hated_41":["3","3"], 
"Greeneggs":["2","2"], 
"William":["1","3"] 
} 

мне нужно как-то вроде того, чтобы выглядеть следующим образом

{ 
"Bob":["1","1"], 
"Dad":["1","2"], 
"William":["1","3"] 
"John":["2","1"], 
"Greeneggs":["2","2"], 
"Skipper42":["2","3"], 
"Mom":["3","1"], 
"Tom":["3","2"], 
"Hated_41":["3","3"] 
} 

Я пытался хранить его в матрице, например, как это:

var $runthrough = [[]]; 
$runthrough[$x,$y] = $values; 

Где x - первый набор чисел, y - следующий, а затем значения - это Боб, Папа и т. Д. ... оттуда я мог бы просто сделать foreach для обеих разделов матрицы, и это было бы сделано, ОДНАКО, когда я использую этот метод после того, как он запускается через один набор объектов, второй набор дает «неопределенный», даже если у меня есть настройка триггеров для проверки, и на самом деле это не будет неопределенным.

var loadarray = JSON.parse(localStorage.getItem('savedme')); 
$.each(loadarray, function(k, v) { 
    if(typeof k === 'undefined' || !k){ 
     console.error("undefined found at k!"); 
    }; 
    if(typeof v[0] === 'undefined' || !v[0]){ 
     console.error("undefined found at x!"); 
    }; 
    if(typeof v[1] === 'undefined' || !v[1]){ 
     console.error("undefined found at y!"); 
    }; 
}); 

поэтому я пришел к выводу, что я, вероятно, делать что-то неправильно с массивами, поэтому я решил, что это будет быстрее разобраться в массиве, а затем использовать ту же функцию. Он должен быть заказан как это, потому что это в основном будет выводиться на матричную таблицу, я пытался приказывать это так:

{ 
    "1":["1","Bob"], 
    "2":["1","John"], 
    } 

... но значение индекса 1 будет просто перезаписывается последним значением

+5

You не может сортировать объект в javascript – charlietfl

ответ

2

Объекты не имеют гарантированного порядка на JavaScript, вам необходимо использовать Array.

определение объекта от ECMAScript Third Edition (pdf):

4.3.3 Объект
Объект является членом типа Object. Это неупорядоченный набор свойств, каждый из которых содержит примитивное значение, объект или . Функция, сохраненная в свойстве объекта, называется методом .

Попробуйте структуру данных, как это вместо:

[ 
{ name: "Bob", value: ["1","1"] }, 
{ name: "Dad", value: ["1","2"] }, 
{ name: "William", value: ["1","3"] }, 
{ name: "John", value: ["2","1"] }, 
{ name: "Greeneggs", value: ["2","2"] }, 
{ name: "Skipper42", value: ["2","3"] }, 
{ name: "Mom", value: ["3","1"] }, 
{ name: "Tom", value: ["3","2"] }, 
{ name: "Hated_41", value: ["3","3"] } 
] 

Вы можете создать такую ​​структуру, как это:

var loadarray = JSON.parse(localStorage.getItem('savedme')); 
var sorted = []; 
for (var prop in loadarray) { 
    if (loadarray.hasOwnProperty(prop)) { 
     sorted.push({name:prop, value:loadarray[prop]}); 
    } 
} 
sorted.sort(function(a, b) { 
    var v0 = a.value[0] - b.value[0]; 
    return v0 == 0 ? a.value[0] - a.value[0] : v0; 
}); 
0

ключи не могут быть отсортированы в объекта.

Однако они могут быть обработаны с использованием Object.keys(object).sort().

Здесь я вывода объекта в массив – отсортированных по значениям клавиши – затем отображающих этот массив:

var obj= { 
 
"Bob":["1","1"], 
 
"John":["2","1"], 
 
"Mom":["3","1"], 
 
"Dad":["1","2"], 
 
"Tom":["3","2"], 
 
"Skipper42":["2","3"], 
 
"Hated_41":["3","3"], 
 
"Greeneggs":["2","2"], 
 
"William":["1","3"] 
 
} 
 

 
var arr= Object.keys(obj) 
 
      .sort(function(a, b) { 
 
      if(obj[a][0]===obj[b][0]) { 
 
       return obj[a][1] - obj[b][1]; 
 
      } 
 
      else { 
 
       return obj[a][0] - obj[b][0]; 
 
      } 
 
      }) 
 
      .map(function(key) { 
 
      var o= {}; 
 
      o[key]= obj[key]; 
 
      return o; 
 
      }); 
 

 
document.body.innerHTML= JSON.stringify(arr);

2

var a = [ 
 
    { "Bob": ["1", "1"] }, 
 
    { "John": ["2", "1"] }, 
 
    { "Mom": ["3", "1"] }, 
 
    { "Dad": ["1", "2"] }, 
 
    { "Tom": ["3", "2"] }, 
 
    { "Skipper42": ["2", "3"] }, 
 
    { "Hated_41": ["3", "3"] }, 
 
    { "Greeneggs": ["2", "2"] }, 
 
    { "William": ["1", "3"] } 
 
]; 
 

 
a.sort(function (a, b) { 
 
    var aa = a[Object.keys(a)], 
 
     bb = b[Object.keys(b)]; 
 
    if (aa[0] === bb[0]) { 
 
    return aa[1] - bb[1]; 
 
    } else { 
 
    return aa[0] - bb[0]; 
 
    } 
 
}); 
 
document.querySelector("#demo").innerHTML = JSON.stringify(a, null, 4);
<div id="demo"></div>