从Object中查找Unicode字符

时间:2014-09-02 03:35:57

标签: javascript

我有一个包含unicodes的大对象,数据结构如下所示

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 个答案:

答案 0 :(得分: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:”的循环结束时保持为null,因为循环正在查找数字,并且过滤后的数组中不再包含任何数字。

data删除第一个条目,删除了错误,确认了这一点。

将过滤器代码更新为以下内容:

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

然后即使存在第一个数据条目也修复了错误。这是一个bin,其中包含更新的代码,在较小的数据集上运行。