2014-09-02 79 views
1

我有一個包含統一碼大的對象,數據結構如下圖所示查找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 undefinedvals操作。

我該如何解決這個問題,這是爲emojis。

回答

1

看着jsbin,我注意到第一個輸入的數據是:"00a9": [["\u00A9"], "\uE24E","\uDBBA\uDF29", ["copyright"], 0, 0]。我們稱這個條目爲「版權」。

聲明

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

將轉向的data這個「版權」進入值:[["\u00A9"], "\uE24E","\uDBBA\uDF29", ["copyright"]]因爲0的值返回false,導致他們被過濾掉。我認爲這個函數的意圖是去除未定義的元素,這是我在這個答案中使用的假設。這反過來會導致spliceI在標有「loop:」的循環結束時保持爲空,因爲循環正在查找數字,並且已過濾的數組中不再有任何數字。

data刪除第一個條目刪除了錯誤,確認了這一點。

更新您的過濾器的代碼,以執行以下操作:

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

然後固定在錯誤即使當數據的第一條目存在。這是一個bin與更新的代碼,運行在一個較小的數據集。