Сортировка объекта JSON - PullRequest
5 голосов
/ 27 мая 2011

Возникла проблема при попытке сортировки объекта JSON.По сути, люди могут добавлять товары в произвольном порядке в нашу форму заказа, но порядок, который он показывает в сводке, должен соответствовать тому, как мы хотим, чтобы они располагались (а не порядок, в котором они выбираются), поэтому мне нужно отсортировать по'id' (или мы будем сортировать по полю 'pos' позже)

По сути, мне нужно отсортировать по возрастанию id.1,2,103 вместо 2,103,1

Кажется, у меня есть проблемы, потому что индекс для отдельных объектов - это числа (или просто тот факт, что они есть ...).

Мне нужно сделать что-то в духе array.sort (function (a, b) {return a.id-b.id});но я предполагаю, что это не работает, потому что 1, это не массив (это объект), и 2, у него есть те надоедливые индексы (которые мне нужны для другой части моего кода) ...

Любые идеи ????

var products = {
    "2": {
        "id": "2",
        "price": "119",
        "quantity": "1",
        "thumb": "img\/store\/comp-08n.png"
    },
    "103": {
        "id": "103",
        "price": "109",
        "quantity": "1",
        "thumb": "img\/store\/basketballhoop.png"
    },
    "1": {
        "id": "1",
        "price": "309",
        "quantity": "1",
        "thumb": "img\/store\/comp-08.png"
    }
};

Ответы [ 5 ]

5 голосов
/ 27 мая 2011

Сколько предметов вам нужно в ваших заказах?Вы можете безопасно сортировать 10 000 элементов в массиве Javascript без особых проблем со скоростью.Почему бы вам вместо этого не работать с реальным массивом?

Вы даже можете добавить в него пользовательские свойства, примерно такие, как

var products = [...];

products.findById = function(id) {
   for (var i=0, len=this.length; i<len; i++) {
      if (id == this[i].id) return this[i];
   }
   return null;
};

alert( products.findById(103).price );   // -> 119

, и добавить предопределенные сортировщики, такие как

products.sortById = function() {
    this.sort(function(a,b) {
        return a.id - b.id;
    });
};

products.sortById();   // sort array by product id

** РЕДАКТИРОВАТЬ **

На вашей стороне PHP вы можете получить что-то вроде:

$products = array(
    2 => array( 'id' => 2, ... ),
    103 => array( 'id' => 103, ... ),
    1 => array( 'id' => 1, ... ),
);

// get a JSON array
$jsonArray = json_encode(array_values($products));

вернет то, что вам нужно.

** ПРИМЕЧАНИЕ **

Вы не должны явно устанавливать индексы при добавлении новых элементов в ваш массив.Используйте функцию массива push, например

products.push({id:123, price:200.49, quantity:1, thumb:'/path/to/file'});

Удаление элемента немного сложнее, но что-то вроде:

products.removeById = function(id) {
   for (var i=0, len=this.length; i<len; i++) {
      if (id == this[i].id) return this.splice(i, 1)[0];
   }
   return null;
};

products.removeById(123);    // -> returns the removed element! or null if nothing was removed

См. Демонстрацию здесь (используйте инструменты разработчика Chrome для вывода на консоль).

4 голосов
/ 27 мая 2011

Существует два типа коллекций в JavaScript и в JSON:

  1. карта ключ / значение (объект) - неупорядоченная коллекция и
  2. Array - карта индекса / значения (массив) - упорядоченная коллекция.

По определению может быть отсортирован только массив. Использовать массив.

2 голосов
/ 04 марта 2014

рекурсивное решение, хотя не работает с массивами, javascript

var alphabetizeJSON = function(obj){
    var key,
        array = [],
        stringifiedValuesObj = {},
        jsonKeyVal = "",
        i,
        keyName;

    for (key in obj) {
        if (typeof obj[key] === "object"){
            stringifiedValuesObj[key] = "" + alphabetizeJSON(obj[key]);
        } else {
            obj[key] = obj[key].replace(/\"/gi,'\\\"');
        }
        array.push(key);
    }

    array.sort();

    for (i = 0; i < array.length; i++){
        keyName = array[i];
        jsonKeyVal += '"' + keyName + '": ';
        jsonKeyVal += stringifiedValuesObj[keyName] ? stringifiedValuesObj[keyName] : '"' + obj[keyName] + '"';
        if (i < array.length - 1 ) {
            jsonKeyVal += ',';
        }
    }

    return '{ ' + jsonKeyVal + '}';
};
0 голосов
/ 27 мая 2011

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

Если вы не можете этого сделать, вы можете преобразовать объект в массив, чтобы упорядочить его ... что-то вроде этого:

var a = []
for (var p in obj) {
  a[+p] = obj[p]
}

Если вы не можете этого сделать, вы можете динамически добавлять информацию на страницу в нужном вам порядке (ниже - плохая идея) ...

for (var i = 0; i < 10000; i++) {
  if (obj[i] !== undefined) {
    add_to_page(obj[i])  //define this somewhere
  }
}
0 голосов
/ 27 мая 2011

Выезд JSONArray с. Они могут быть тем, что вам нужно. http://json.org/java/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...