Как мне преобразовать хэш json в хэш массивов в javascript? - PullRequest
2 голосов
/ 07 декабря 2010

Итак, если у меня есть:

var hashof = {"stuff":
{"1": { "name": "fred"}},
{"2": { "name": "barney"}}
};

Как я могу использовать функцию javascript для получения:

var hashof = {"stuff":
["name" : "fred"],
["name" : "barney]
};

Я хочу использовать структуру с mustache.js.

Ответы [ 4 ]

2 голосов
/ 07 декабря 2010

Последнее невозможно. Это недействительно. Вы, вероятно, хотели что-то вроде этого:

var hashof = {"stuff": [
    {"name" : "fred"},
    {"name" : "barney"}
] };

Следующее должно преобразовать это так, как вам нужно:

function convert(input) {
    var output = [],
        key;

    for (key in input.stuff) {
        if (input.stuff.hasOwnProperty(key)) {
            output[parseInt(key, 10)] = input.stuff[key];
        }
    }

    return {stuff: output};
}

Имейте в виду, что результирующий массив может быть разреженным. Если вы хотите избежать этого, вы можете использовать заменить строку

output[parseInt(key, 10)] = input.stuff[key];

с

output.push(input.stuff[key]);

но тогда вы не сможете сохранить исходные ключи (по крайней мере, это не гарантировано).

1 голос
/ 07 декабря 2010

Javascript не имеет ассоциативных массивов.Эквивалентом является «хеш», как вы его называете, или объект, которым он является на самом деле.Лучшее, на что вы можете надеяться, это: {"stuff": [{"name": "fred"}, {"name": "barney"}]}

Следующее не проверено, но, по крайней мере, должно направить вас в правильном направлении.* Кажется, что входной объект не имеет ожидаемого формата (или, фактически, формата, который я читаю, когда читаю его в первый раз).В настоящее время у него есть два свойства:

  • "материал" равен {"1": {"name": "fred"}}
  • Есть еще один элемент без ключа, равный {"2": {"name": "barney"}} (ключ может быть 0,Я не уверен в этом)

Итак, input.stuff имеет только один предмет, в то время как input[0] имеет другой предмет.Если бы это было следующим образом, это имело бы больше смысла:

var input = {
    "stuff": {
        "1": {"name": "fred"},
        "2": {"name": "barney"}
    }
}

Если бы это было так, мой код выше работал бы.С данным вводом, это не будет.

0 голосов
/ 07 декабря 2010

Я действительно должен проверить это, но быстро и грязно, похоже, это будет работать ...

 $.each(hashof.stuff, function(index, val) {
     hashof.stuff[index] = val.index;
  });
0 голосов
/ 07 декабря 2010

Массивы в javascript могут иметь только числовой индекс, вам нужно использовать Object, чтобы иметь ассоциативный массив.

Массив - это упорядоченный набор значений связан с одной переменной название. Обратите внимание, что вы не должны использовать его в качестве ассоциативного массива используйте Object вместо этого.

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array

...