«Uncaught SyntaxError: неожиданный токен:», когда нет «:»?

0

Данные 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/

Теги:
google-chrome-devtools

2 ответа

1
Лучший ответ

Вам нужно создать объект ({…}), а не массив ([…]). Это будет работать:

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;
};

демонстрация

  • 0
    Спасибо, этот ответ потрясающий. Мне было интересно, как это сделать.
2

Промежуточный 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;
};
  • 0
    +1 похоже, что мы оба независимо разработали почти идентичные решения.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню