2016-08-15 86 views
-2

我想搜索一个Javascript对象的所有elemetns,并替换文本“???”的每一个出现。比如说,“***”。查找并替换JSON对象元素中的文本?

的JSON的一个例子是

{ 
    "page-title": "Tasks", 
    "sections": [{ 
     "section-heading": "Work", 
     "subsections": [{ 
      "subsection-heading": "First", 
      "subsection-texts": [{ 
       "text": "This is some text." 
      }] 
     }, { 
      "subsection-heading": "Second", 
      "subsection-texts": [{ 
       "text": "This is some more text." 
      }, { 
       "text": "This is even more text ???." 
      }] 
     }, { 
      "subsection-heading": "Third ???", 
      "subsection-texts": [{ 
       "text": "This is the last text." 
      }] 
     }] 
    }] 
} 

正如你所看到的, “???”文本可能处于不同的级别。那么是否有某种方法可以用“***”来搜索和替换每个$ ??? $?

我正在寻找一种方法,将检查实际的JSON对象元素,我不想要一个方法,然后使用正则表达式的字符串对象。这可以有效地完成吗?

+1

JSON对象是用词不当。你的意思是一个JavaScript对象或JSON字符串? – trincot

+0

@trincot确定我已将它更改为Javascript对象。 – sonicboom

回答

0

可以通过所有对象属性或数组项迭代地图/减少和替换所有问号字符串:

var data = { ... } 

function replaceQuestionMarks(obj) { 
    if (Array.isArray(obj)) { 
     return obj.map(function(o) { 
      return replaceQuestionMarks(o); 
     }) 
    } else if (typeof obj === 'object') { 
     return Object.keys(obj).reduce(function(r, key) { 
      r[key] = replaceQuestionMarks(obj[key]); 
      return r; 
     }, {}) 
    } else if (typeof obj === 'string') { 
     return obj.replace('???', '***'); 
    } 
    return obj; 
} 

var replaced = replaceQuestionMarks(data); 
+0

谢谢,这是伟大的!我想知道是否有可能使它工作,如果有多于一个'???'在字符串中? – sonicboom

+1

@sonicboom肯定只是使用正则表达式替换函数'obj.replace(/ \?/ g,'*');' – madox2

+0

其实我刚刚注意到一个问题。如果JSON数据是字符串形式,则该代码有效。但是,如果数据是一个Javascript对象(例如,在用JSON.parse解析数据字符串之后),那么会出现一个错误:ReferenceError:replace没有定义(...)。它发生在这一行:r [key] = replace(obj [key]); – sonicboom

-3

一种方法是将其转换为字符串,使用正则表达式替换问号,然后解析回到对象:

var myObject = {...}; 
myObject = (JSON.parse(JSON.stringify(myObject).replace(/\?\?\?/gi, '***'))); 

这可能不是做这件事而言的最佳方式的表现,但我们需要更多关于你实际在做什么的细节。这可能与其他方式一样有效。你需要做这件事的对象有多大?

+1

阅读问题的最后一段。 – trincot

+0

哈哈......我想我在阅读完之前跳过了答案。但是,替换与字符串“???”匹配的文本与其他东西需要一些手动解析或正则表达式。这种方法可能比其他方法更有效。 – mcgraphix

+0

“无论是手动解析还是正则表达式”你是什么意思?只需遍历对象的所有值并根据需要修改它们是完全可行的,而不需要将对象视为字符串。 – vlaz