2017-11-06 1 views
-1

나는 대문자 (toUpper/toLower 경우)를 변경하기 위해 JavaScript에서 JSON.Stringify의 replacer 함수 인수를 이용하는 방식으로 작업하고 있습니다. 문제는 JSON이 직선적 인 key : value가 아닌 것입니다. 일부 값은 키이며 또한 값 자체를 가지고 있으므로 모든 키와 값을 살펴보고 값이 키인지 확인한 다음 모든 키와 값에 대해 대문자 (toUpper 또는 toLower)를 변경해야합니다. JSON.Stringify (object, ReplacerFunction)의 replacer 함수가 모든 키와 값을 반복하고 그 내부에서 수정을 수행하여 키와 값을 반환한다는 것을 알고 있지만 적용 할 수없는 그리고 replacer 함수 내부에서 재귀를 적용해야하는지 또는 어떤 방법으로 도움을 주어야하는지 확실하지 않습니다.JSON Stringify를 사용하여 모든 키와 값을 대체하려면 어떻게해야합니까?

코드는 내가했다 : 또한

function _replacer(name,val){ 
    if(typeof val != "object"){ 
     return val.toString().toUpperCase() 
    } 
    if(typeof name != "object"){ 
      return name.toString().toUpperCase() 
     } 

    console.log("key = "+name+" type: "+typeof name); 
    console.log("value ="+val+" type: "+typeof val); 

    } 

: 또한

function _replacer(name,val){ 
    if(typeof val != "object" &&typeof val ==="string"){ 
     return val=val.toUpperCase() 
    } 
    if(typeof name != "object" &&typeof name ==="string"){ 
      name=name.toUpperCase() 
     } 
    return val; 
    } 

, 나는 결국이 단계에 도착 :

는하지만이 코드는 매우 낮은 수준의 값을 대문자로
var res = JSON.parse(JSON.stringify(j, function(key, value) { 
     return typeof value === "string" ? value.toUpperCase() : value 
    })); 

, 모든 키/값이 아니라 이유는 내가이 값은 replacer 함수에서 하나의 값을 반환 할 수 있기 때문입니다. 가치.

+0

시도한 코드를 공유하십시오. – jmargolisvt

+0

@jmargolisvt, 공유 함. – HMA

+0

유용하다고 말하는 것보다 내 합리적인 질문에 투표하는 것이 얼마나 많은 사람들이 더 많은지 놀라게합니다. – HMA

답변

0

JSON.stringify에있는 replacer 함수는 사용자가 키를 바꾸지 못하게합니다 (documented in MDN). 값을 변환하거나 키/값 쌍을 생략 할 수 있습니다 (undefined 반환).

가장 좋은 방법은 개체를 문자열로 변환하기 전에 개체를 변환하는 것입니다. 밑줄 또는 Lodash이 꽤 쉽게 만들 것입니다,하지만 당신은 이런 식으로 너무 많은 문제없이 기본적으로 그것을 할 수 있습니다 :

또한 정규식을 사용할 수
const xform = obj => { 
    return Object.keys(obj).reduce((xformed, key) => { 
    let value = obj[key] 

    if (typeof value ==='string') value = value.toUpperCase() 
    else if (typeof value === 'object') value = xform(value) 

    xformed[key.toUpperCase()] = value 
    return xformed 
    }, {}) 
} 

console.log(JSON.stringify(xform({a: 'b', c: 1, d: {e: 'f'}}))) 
// {"A":"B","C":1,"D":{"E":"F"}} 

당신이 그렇게 경사 경우는도 캐릭터 라인입니다 후 replace합니다. 코드는 확실히 짧지 만 읽기 쉽지 않습니다.

const stringified = JSON.stringify({a: 'b', c: 1, d: {e: 'f'}}) 
console.log(stringified.replace(/".+?"/g, s => s.toUpperCase())) 
// {"A":"B","C":1,"D":{"E":"F"}} 
+0

감사하지만, s => s, s의 값 ? – HMA

+0

[ES6 화살표 기능] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions)입니다. 's => s'는'function (s) {return s}'와 대략 같습니다. 두 매개 변수는 단일 매개 변수 ('s')를 취한 다음이를 반환합니다 (또는 내 답변에서 대문자로 반환하는). 차이점은 다소 기술적인데, 주로 화살표 함수에는'this' 또는'arguments' 객체가 없습니다. –

관련 문제