我有一个包含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,运行在一个较小的数据集上。