正在从对象中查找Unicode字符



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

var data = {
   "1f1f7-1f1fa":[["uD83CuDDF7uD83CuDDFA"],"uE512","uDBB9uDCEC",["ru"],28,3],
   "1f1fa-1f1f8":[["uD83CuDDFAuD83CuDDF8"],"uE50C","uDBB9uDCE6",["us"],28,4]
   ....
   ....
};

我想把它做成

var final = {
    "uD83CuDDF7uD83CuDDFA" : "ru",
    "uE512" : "ru",
    "uDBB9uDCEC" : "ru"
    ...
    ...
}

这是代码和仓

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]变成了[],所以我得到了vals操作的错误Uncaught TypeError: Cannot read property 'length' of undefined

我该怎么解决这个问题,这是表情符号。

查看jsbin,我注意到第一个数据条目是:"00a9": [["u00A9"], "uE24E","uDBBAuDF29", ["copyright"], 0, 0]。让我们把这个条目称为"版权"。

声明

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

将把data的这个"版权"条目变成值:[["u00A9"], "uE24E","uDBBAuDF29", ["copyright"]],因为0值返回false,导致它们被过滤掉。我认为这个函数的意图是删除未定义的元素,这是我在这个答案中使用的假设。这反过来会导致spliceI在标记为"loop:"的循环结束时保持为空,因为循环正在寻找数字,而过滤后的数组中不再有任何数字。

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

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

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

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

最新更新