2014-09-02 3 views
1

У меня есть большой объект, содержащий юникоды, структура данных, как показано нижесимволы Finding Unicode от объекта

var data = { 
    "1f1f7-1f1fa":[["\uD83C\uDDF7\uD83C\uDDFA"],"\uE512","\uDBB9\uDCEC",["ru"],28,3], 
    "1f1fa-1f1f8":[["\uD83C\uDDFA\uD83C\uDDF8"],"\uE50C","\uDBB9\uDCE6",["us"],28,4] 
    .... 
    .... 
}; 

И я хотел бы сделать это как

var final = { 
    "\uD83C\uDDF7\uD83C\uDDFA" : "ru", 
    "\uE512" : "ru", 
    "\uDBB9\uDCEC" : "ru" 
    ... 
    ... 
} 

Вот код и bin

var final = {}; 

for(var i in data) { 

    var arr = [], spliceI = null; 

    arr = data[i]; 

    arr = arr.filter(function(str){ 
     return str; 
    }); 

    loop: 
    for(var j = 0; j < arr.length; j++){ 

     if(arr[j] === +arr[j]){ 
      spliceI = j; 
      break loop; 
     } 
    } 

    arr.splice(spliceI, arr.length); 

    var vals = arr.splice(-1).pop(); 

    if(vals == undefined) debugger; 

    console.log(vals); 

    arr = arr.concat.apply(arr, data[i]); 

    for(var k = 0; k < vals.length; k++){ 
     for(j = 0; j < arr.length; j++){ 
      final[arr[j]] = vals[k]; 
     } 
    } 
} 

Но неожиданно данные [i] превращаются в [], поэтому я получаю ошибку Uncaught TypeError: Cannot read property 'length' of undefined для vals работа.

Как исправить это, это для эможи.

ответ

1

Глядя на jsbin, я заметил, что первая запись данных: "00a9": [["\u00A9"], "\uE24E","\uDBBA\uDF29", ["copyright"], 0, 0]. Назовем эту запись «авторским правом».

Заявление

arr = arr.filter(function(str){ 
    return str; 
}); 

превратит эту запись «копирайт» из data в значение: [["\u00A9"], "\uE24E","\uDBBA\uDF29", ["copyright"]], так как 0 значения возвращают ложь, заставляя их быть отфильтрованы. Я думаю, что целью этой функции является удаление неопределенных элементов, это предположение, которое я использую в этом ответе. Это, в свою очередь, приведет к тому, что spliceI останется нулевым в конце вашего цикла с надписью «loop:», поскольку цикл ищет числа, а отфильтрованный массив больше не имеет в нем цифр.

Снятие первой записи с data удалило ошибку, подтвердив это.

Обновление кода фильтра следующие:

arr = arr.filter(function (str) { 
    return typeof(str) !== 'undefined'; 
}); 

Тогда исправлена ​​ошибка, даже если первая запись данных присутствовала. Вот bin с обновленным кодом, работающим на меньшем наборе данных.

Смежные вопросы