循环对象

时间:2018-12-21 16:44:02

标签: javascript

我正在解码一个对象,到目前为止,它已经可以工作了。假设我有这个对象:

var person = [{
   firstname: "Mike",
   lastname: "123ñññ"
   age: 20
}]

因此,为了解码&ntilde并渲染ñ,我只是这样做:

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'
         }
     ]
   }
}]

注意:

我不需要帮助来解码对象上每个属性的值,因为我已经在这样做了,我只需要提供一个对嵌套对象执行此操作的递归函数

3 个答案:

答案 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中,例如有zipperwalk

您可以自己编写它,但是它很快就会变得复杂,因此我怀疑使用JSON.stringify + parse可以满足您的需求。这两个函数都采用第二个参数,分别为replacerreviver,使您可以截取转换并更改值。

以下是官方文档中的示例:

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);