Данные JSON без индексов:
var knol = [
{"hant":"火","status":1,"rank":30,"score": 1},
{"hant":"人","status":1,"rank":33,"score": 2},
{"hant":"山","status":1,"rank":60,"score": 5},
{"hant":"是","status":1,"rank":50,"score": 3}
];
Учитывая JS-функцию для воссоздания данных с индексами:
var addIndex = function(object, key1, key2){
var data = object;
var newData = "[";
for (var i in data) {
if (!key2) {
var newIndex = data[i][key1]
} else {
var newIndex = data[i][key1] + data[i][key2]
}
newData = newData + "\"" + newIndex + "\":" + JSON.stringify(data[i]) +",";
}
newData = newData.concat("]").replace(",]", "]");
console.log(newData);
newData = JSON.parse(newData);
return newData;
};
knol = addIndex(knol, "hant");
Я получаю сообщение об ошибке "Uncaught SyntaxError: Unexpected token :"
, в то время как в указанном месте в коде отсутствует ":". Кажется, это сбой моего более крупного сценария. Любая идея, что происходит?
Скрипт: http://jsfiddle.net/n9pf6/2/
Вам нужно создать объект ({…}
), а не массив ([…]
). Это будет работать:
var newData = "{";
for(var i in data){
if(!key2){ var newIndex = data[i][key1] }else{ var newIndex = data[i][key1]+ data[i][key2]}
newData = newData + "\""+newIndex+"\":"+JSON.stringify(data[i])+",";
}
newData = newData.concat("}").replace(",]", "]").replace(",}", "}");
Однако я настоятельно рекомендую просто манипулировать данными напрямую, а не пытаться вручную построить строку JSON из различных частей.
Вот простая реализация:
var addIndex = function(object, key1, key2){
var data = object, newData = {}, newIndex;
for(var i in data){
if(!key2){
newIndex = data[i][key1];
}else{
newIndex = data[i][key1]+ data[i][key2];
}
newData[newIndex] = data[i];
}
console.log(newData);
return newData;
};
Промежуточный JSON неверен, поэтому последний JSON.parse
не работает. Промежуточный текст ["火":{"hant":"火",..
, как сообщается на консоли, и это действительно неверно, поскольку в массивах нет ключей.
Просто создайте/перестройте весь объект-граф как объект JS, а затем используйте JSON.stringify
один раз на нем - или, в этом случае, никогда, поскольку конечный результат будет JS-объектом в любом случае!
var addIndex = function(data, key1, key2){
var newData = {}; // new JS object - there is /no/ JSON here.
var newIndex;
for(var i in data){
if(!key2){
newIndex = data[i][key1];
}else{
newIndex = data[i][key1] + data[i][key2];
}
// add data to new object with appropriate property/key
// and do NOT manually build JSON text.
newData[newIndex] = data[i];
}
// return object directly; it not JSON text, no need to parse it!
return newData;
};