我正在解码一个对象,到目前为止,它已经可以工作了。假设我有这个对象:
var person = [{
firstname: "Mike",
lastname: "123ñññ"
age: 20
}]
因此,为了解码ñ
并渲染ñ
,我只是这样做:
new DOMParser().parseFromString(person[0].lastname, "text/html").documentElement.textContent;
这将呈现值
ñññ
这就是我想要的,所以它看起来像这样:
姓:“ñññ”
但是,我面临的问题是我需要对对象中每个属性的值进行解码,因为我可能会得到名字或其他属性的特殊字符。所以我的问题是,假设对象看起来像这样,如何解码对象的属性值:
var person = [{
name: "Mike",
lastname: "123ñññ"
age: 20,
employeer: {
name: 'ABC Company ñê',
supervisors:[
{
name: 'Steveä',
code: 'è468'
}
]
}
}]
注意:
我不需要帮助来解码对象上每个属性的值,因为我已经在这样做了,我只需要提供一个对嵌套对象执行此操作的递归函数
答案 0 :(得分:1)
我认为使用DOMParser进行递归解码是一个好主意。这是一个就地变压器。首先执行深度复制,然后根据需要进行原位转换。
var person = [{
name: "Mike",
lastname: "123ñññ",
age: 20,
employer: {
name: 'ABC Company ñê',
supervisors: [
{
name: 'Steveä',
code: 'è468'
}
]
}
}];
console.log(person);
function htmlDecode(input)
{
var doc = new DOMParser().parseFromString(input, "text/html");
return doc.documentElement.textContent;
}
function fix(obj) {
for (let prop in obj) {
switch (typeof obj[prop]) {
case 'object':
fix(obj[prop]);
break;
case 'string':
obj[prop] = htmlDecode(obj[prop]);
break;
}
}
}
fix(person);
console.log(person);
答案 1 :(得分:0)
在功能语言中,有一些库可以递归遍历树结构。在Clojure中,例如有zipper和walk。
您可以自己编写它,但是它很快就会变得复杂,因此我怀疑使用JSON.stringify + parse可以满足您的需求。这两个函数都采用第二个参数,分别为replacer
和reviver
,使您可以截取转换并更改值。
以下是官方文档中的示例:
function replacer(key, value) {
// Filtering out properties
if (typeof value === 'string') {
return undefined;
}
return value;
}
var foo = {foundation: 'Mozilla', model: 'box', week: 45, transport: 'car', month: 7};
JSON.stringify(foo, replacer);
// '{"week":45,"month":7}'
答案 2 :(得分:0)
尝试一下:
function decodeObject(obj){
if(typeof obj == 'object'){
var text = JSON.stringify(obj),
div = document.createElement('div');
div.innerHTML = text;
obj = JSON.parse(div.childNodes[0].nodeValue);
}
return obj;
}
var person = decodeObject([{
name: "Mike",
lastname: "123ñññ",
age: 20
}]);
console.log(person);