json 대상 의 key 최 적 방안 교체

7444 단어 json대상key
JSON(JavaScript Object Notation,JS 대상 약보)은 경량급 데이터 교환 형식 이다.이 는 ECMAScript(유럽 컴퓨터 협회 가 제정 한 js 규범)의 키 집합 을 바탕 으로 프로 그래 밍 언어 에 완전히 독립 된 텍스트 형식 으로 데 이 터 를 저장 하고 표시 합 니 다.간결 하고 뚜렷 한 차원 구 조 는 JSON 을 이상 적 인 데이터 교환 언어 로 만 들 었 다.사람 이 읽 고 쓰기 쉬 우 며 기계 적 으로 해석 하고 생 성 하기 쉬 우 며 네트워크 전송 효율 도 효과적으로 향상 시킨다.
제목 을 보면 이렇게 간단 한 문 제 를 탐구 할 가치 가 있다 고 생각 할 수 있 습 니까?만약 제 이 슨 object 가 있다 면 아래 의 간단 한 몇 줄 코드 만 있 으 면 완성 할 수 있 습 니 다.

var obj = {
    "_id": "5078c3a803ff4197dc81fbfb",
    "email": "[email protected]",
    "image": "some_image_url",
    "name": "Name 1"
};

var new_key = "id";
var old_key = "_id";

obj[new_key] = obj[old_key];
delete obj[old_key];
네,맞아요!상기 코드 는 작업 을 잘 완성 하여 obj 대상 중의"id"를"id"로 대체 합 니 다.
대부분의 경우 이런 방식 은 문 제 를 가 져 오지 않 습 니 다.그러나 obj 대상 을 문서 에 정렬 하고 차 이 를 비교 해 야 한다 면 문 제 를 볼 수 있 습 니 다.

//      obj
{
    "_id": "5078c3a803ff4197dc81fbfb",
    "email": "[email protected]",
    "image": "some_image_url",
    "name": "Name 1"
}

//      obj 
// JSON.stringify(obj, null, "\t")
{
    "email": "[email protected]",
    "image": "some_image_url",
    "name": "Name 1",
    "id": "5078c3a803ff4197dc81fbfb"
}
새로 추 가 된 key 는 기본적으로 마지막 에 놓 여 있 으 며,교체 과정 에서 이전 key 를 삭 제 했 기 때문에 직렬 화 된 obj 는 이전 obj 와 큰 차이 가 있 습 니 다.

그러면 어떻게 해야만 최소 차이 상황 에서 키 의 교 체 를 실현 할 수 있 습 니까?다음은 내 가 찾 은 몇 가지 방법 이다.

Object.prototype.renameProperty = function (oldName, newName) {
     // Do nothing if the names are the same
     if (oldName === newName) {
         return this;
     }
    // Check for the old property name to avoid a ReferenceError in strict mode.
    if (this.hasOwnProperty(oldName)) {
        this[newName] = this[oldName];
        delete this[oldName];
    }
    return this;
};

function renameKeys(obj, newKeys) {
  const keyValues = Object.keys(obj).map(key => {
    const newKey = newKeys[key] || key;
    return { [newKey]: obj[key] };
  });
  return Object.assign({}, ...keyValues);
}


const obj = { a: "1", b: "2" };
const newKeys = { a: "A", c: "C" };
const renamedObj = renameKeys(obj, newKeys);
console.log(renamedObj);
// {A:"1", b:"2"}

//   lodash _.mapKeys()  
var user = {
  name: "Andrew",
  id: 25,
  reported: false
};

var renamed = _.mapKeys(user, function(value, key) {
  return key + "_" + user.id;
});

console.log(renamed);

var str = JSON.stringify(object);
str = str.replace(/oldKey/g, 'newKey');
str = str.replace(/oldKey2/g, 'newKey2');

object = JSON.parse(str);

function renameObjectKey(oldObj, oldName, newName) {
    const newObj = {};

    Object.keys(oldObj).forEach(key => {
        const value = oldObj[key];

        if (key === oldName) {
            newObj[newName] = value;
        } else {
            newObj[key] = value;
        }
    });

    return newObj;
}

data = {key1: "value1", key2: "value2", key3: "value3"}; 

keyMap = {key1: "firstkey", key2: "secondkey", key3: "thirdkey"};

mappedData = Object.keys(keyMap).reduce((obj,k) => Object.assign(obj, { [keyMap[k]]: data[k] }),{});

console.log(mappedData);
위의 이러한 예 들 중 일 부 는 우리 의 요구 에 도달 할 수 있 고,다른 일 부 는 본 고의 시작 부분 에서 제시 한 코드 와 기본 적 인 효과 가 있다(단지 집행 효율 에 약간의 차이 가 있 을 뿐이다).그러나 이 모든 예 는 예외 없 이 다음 두 가지 요 구 를 동시에 만족 시 킬 수 없다.
바 꿀 키 의 원래 json 대상 순 서 를 유지 합 니 다.JSON.stringify()가 실 행 된 후에 출력 하 는 문자열 에서 key 의 순서 가 원래 json 대상 과 일치 하도록 보장 합 니 다.새로운 제 이 슨 대상 으로 돌아 가 는 것 이 아니 라 원래 제 이 슨 대상 에서 수정 합 니 다.어떤 경우 에 우 리 는 복잡 한 json 대상 의 하위 요 소 를 수정 해 야 한다.수정 한 후에 새로운 json 대상 으로 돌아 가면 이 새로운 대상 이 원래 json 대상 에 반응 할 것 이 라 고 보장 할 수 없다.예 를 들 어jspathdomain-specific languge(DSL)를 통 해 주어진 json 대상 에서 하위 요 소 를 찾 을 수 있 는 자바 script 라 이브 러 리 입 니 다.아래 코드 를 통 해 우 리 는 obj 대상 에서 autobiles 속성 중 maker==="Honda"와 year>2009 요 소 를 쉽게 찾 을 수 있 습 니 다.

var obj = {
    "automobiles" : [
        { "maker" : "Nissan", "model" : "Teana", "year" : 2011 },
        { "maker" : "Honda", "model" : "Jazz", "year" : 2010 },
        { "maker" : "Honda", "model" : "Civic", "year" : 2007 },
        { "maker" : "Toyota", "model" : "Yaris", "year" : 2008 },
        { "maker" : "Honda", "model" : "Accord", "year" : 2011 }
    ],
    "motorcycles" : [{ "maker" : "Honda", "model" : "ST1300", "year" : 2012 }]
};

var res = JSPath.apply('.automobiles{.maker === "Honda" && .year > 2009}', obj);

// res: [{ "maker" : "Honda", "model" : "Jazz", "year" : 2010 }, { "maker" : "Honda", "model" : "Accord", "year" : 2011 }]
여기 서 돌아 오 는 res 대상 은 obj 대상 의 일부분 이 며,추 후 res 대상 에 대한 어떠한 수정 도 obj 대상 에 반응 한 다 는 것 을 의미 합 니 다.만약 우리 가 res 의 일부 key 를 교체 하고 새로운 json 대상 으로 돌아간다 면 이 수정 은 obj 대상 에 반응 하지 않 을 것 입 니 다.
기본 사고방식:새로 추 가 된 키 가 기본적으로 마지막 에 있 으 니 json 대상 의 모든 키 를 아예 옮 겨 다 니 고 키 를 하나하나 임시 이름 으로 바 꾼 다음 에 이 임시 이름 을 바 꿉 니 다.이 과정 에서 진정 으로 교체 해 야 할 키 를 만나면 2 차 교 체 를 하지 않 는 다.다음은 구체 적 인 코드 입 니 다.

var obj = {
    "_id": "5078c3a803ff4197dc81fbfb",
    "email": "[email protected]",
    "image": "some_image_url",
    "name": "Name 1"
};

var new_key = "id";
var old_key = "_id";

Object.keys(obj).forEach(key => {
    if (key === old_key) {
        obj[new_key] = obj[key];
        delete obj[key];
    } else {
        obj[`_${key}`] = obj[key];
        delete obj[key];

        obj[`${key}`] = obj[`_${key}`];
        delete obj[`_${key}`];
    }
});
완성 후의 효 과 는 다음 그림 과 같다.

물론 유 니 버 설 성 을 고려 하면 주어진 제 이 슨 대상 을 재 귀적 으로 옮 겨 다 녀 야 할 수도 있다.상기 코드 는 하나의 방향 만 제시 하고 집행 효율 과 안전성 을 고려 하면 이것 은 최선 의 방안 이 아니 라 실제 사용 에서 우 리 는 점차적으로 보완 할 수 있다.
이상 은 json 대상 중의 key 를 교체 하 는 가장 좋 은 방안 에 대한 상세 한 내용 입 니 다.json 대상 중의 key 를 교체 하 는 데 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!

좋은 웹페이지 즐겨찾기