Programing

개체에서 모든 속성 제거

lottogame 2020. 12. 10. 08:25
반응형

개체에서 모든 속성 제거


이 Javascript 개체가 있습니다.

req.session

내 코드에서이 개체에 속성을 추가합니다. 이러한 속성은 다른 객체, 배열 또는 일반 문자열 일 수 있습니다.

req.session.savedDoc = someObject; 
req.session.errors = ['someThing', 'anotherThing', 'thirdThing'];
req.session.message = 'someString'

나중에이 개체의 추가 된 모든 속성을 지우고 싶은 경우 가장 쉽고 / 가장 좋은 방법은 무엇입니까?

이것보다 더 좋은 방법이있을 텐데요?

// Delete all session values
delete req.session.savedDoc;
delete req.session.errors;
delete req.session.message;

빈 개체를 할당하기 만하면됩니다.

req.session = {};

... 가비지 수집기가 나머지 작업을 자동으로 수행합니다.


업데이트 : 이 답변은 논쟁의 여지가 있으므로 요점에 대한 자세한 내용을 제공하고 싶습니다.

위에 제공된 솔루션은 현재 상황에서 작성자와이 질문에 제공된 다른 유효한 솔루션을 위해 작업을 수행합니다. 주로 개발자가 사용되지 않는 데이터를 조작하려는 방식에 따라 다릅니다.

세션 개체는 다른 변수로 연결된 데이터를 포함 할 수 있으며 새 빈 개체를로 설정해도 req.session이전 데이터에 대한 참조가 깨지지 않으므로 여전히 필요한 곳에서 이전 데이터를 사용할 수 있습니다. 오래된 데이터를 유지하는 올바른 방법은 초기 개체를 복제하는 것이지만 실제 시나리오는 다를 수 있습니다. 다음 예를 살펴 보겠습니다.

req.session.user = { name: 'Alexander' };  // we store an object in the session
var session = req.session;                 // save reference to the session in a variable
console.log( req.session, session );       // {user: Object}, {user: Object}

req.session = {};                          // let's replace session with a new object
console.log( req.session, session );       // {}, {user: Object}

우리는 여전히 session변수 에서 오래된 데이터를 가져올 수 있지만 req.session비어 있습니다. 여기서 새 개체를 설정하는 것은 딥 클로닝의 대안으로 작동합니다. 가비지 수집기 req.session는 여전히 session변수에 의해 참조되므로 이전 개체 에서 데이터를 제거하지 않습니다 .

@Dave 또는 더 짧은 비아 Object.keys(프로토 타입 체인의 속성을 무시하고 node.js에 대한 shim이 필요하지 않음)에서 제공하는 메서드를 사용하여 객체를 철저히 정리 합니다 .

Object.keys(object).forEach(function(key) { delete object[key]; });

... 객체 에서 모든 값을 명시 적으로 제거하고 변수가 동일한 객체에 연결되어 있으므로 비어있게됩니다. 작동 원리를 살펴 보겠습니다.req.sessionsessionsession

req.session.user = { name: 'Alexander' };  // we store an object in the session
var session = req.session;                 // save reference to the session in a variable
console.log( req.session, session );       // {user: Object}, {user: Object}

Object.keys(req.session).forEach(function(key) { delete req.session[key]; });
console.log( req.session, session );       // {}, {}

지금 보시다시피 두 경우 모두 빈 객체를 얻습니다.

속도 및 메모리 관점에서 새 빈 개체를 설정하는 것이 속성별로 이전 개체 속성을 정리하는 보다 훨씬 빠르지 만, 메모리 측면에서 이전 데이터가 여전히 어딘가에 참조되는 경우 새 개체 접근 방식은 이전 데이터가 소비하는 메모리를 확보하지 않습니다.

취할 접근 방식을 선택하는 것은 대부분 코딩 시나리오에 달려 있지만 대부분의 경우 req.session = {};작업을 수행 할 것입니다. 빠르고 짧습니다. 그러나 다른 변수의 원래 개체에 대한 참조를 유지하는 경우 암시 적 개체 속성 삭제를 사용하는 것을 고려할 수 있습니다.


특정 참조를 지우고 싶다면 @VisioN의 대답이 작동하지만 실제로 객체를 지우고 싶다면 이것이 작동한다는 것을 알았습니다.

for (var variableKey in vartoClear){
    if (vartoClear.hasOwnProperty(variableKey)){
        delete vartoClear[variableKey];
    }
}

개체에서 자신의 속성을 제거하는 올바른 솔루션은 하나만 볼 수 있습니다.

for (var x in objectToClean) if (objectToClean.hasOwnProperty(x)) delete objectToClean[x];

두 번 이상 사용하려면 청소 기능을 만들어야합니다.

function deleteProperties(objectToClean) {
  for (var x in objectToClean) if (objectToClean.hasOwnProperty(x)) delete objectToClean[x];
}

귀하의 경우 사용법은 다음과 같습니다.

deleteProperties(req.session);

이 솔루션은 참조되는 위치에 관계없이 개체에서 속성을 제거하고 이전 참조를 유지합니다.
예 :
빈 개체 할당 사용 :

var x = {a: 5};
var y = x;
x = {};    // x will be empty but y is still {a: 5}, also now reference is gone: x !== y

청소 방법 사용 :

var x = {a: 5};
var y = x;
deleteProperties(x);  // x and y are both empty and x === y

메서드를 건드리지 않고 모든 속성을 삭제하려면 다음을 사용할 수 있습니다.

for(var k in req.session) if(!req.session[k].constructor.toString().match(/^function Function\(/)) delete req.session[k];

이렇게 했어요

var 
    i,
    keys = Object.keys(obj);
for(i = 0; i < keys.length; i++){
    delete obj[keys[i]];
}

객체에 추가 할 수 있습니다 (여기서 프로토 타입은 이상적이지 않음)-정적입니다.

Object.defineproperties(Object, {
    'clear': function(target){
        var 
            i,
            keys = Object.keys(target);
        for(i = 0; i < keys.length; i++){
            delete target[keys[i]];
        }
    }
});

그런 다음 임의의 개체를 지울 수 있습니다.

Object.clear(yourObj);

yourObj = {} 새 객체에 대한 참조를 대체하고, 위는 속성을 제거합니다. 참조는 동일합니다.


이 스크립트는 벡터로보고 된 데이터를 제외하고 재귀 적으로 속성을 제거합니다.

lodash 라이브러리 가 필요합니다.

-- 함수:

function removeKeysExcept(object, keysExcept = [], isFirstLevel = true) {
        let arrayKeysExcept = [],
            arrayNextKeysExcept = {};
        _.forEach(keysExcept, (value, i) => {
            let j = value.split('.');
            let keyExcept = j[0];
            arrayKeysExcept.push(keyExcept);
            j.shift();
            if (j.length) {
                j = j.join('.');
                if (!arrayNextKeysExcept[keyExcept]) {
                    arrayNextKeysExcept[keyExcept] = [];
                }
                arrayNextKeysExcept[keyExcept].push(j);
            }
        })
        _.forEach(arrayNextKeysExcept, (value, key) => {
            removeKeysExcept(object[key], value, false);
        });
        if (isFirstLevel) {
            return;
        }
        Object.keys(object).forEach(function (key) {
            if (arrayKeysExcept.indexOf(key) == -1) {
                delete object[key];
            }
        });
    }

그렇게 실행 :

-첫 번째 수준을 제외한 모든 속성을 제거하고 벡터에보고합니다.

removeKeysExcept(obj, ['department.id','user.id']);

-모든 속성을 제거합니다.

removeKeysExcept(obj, ['department.id','user.id'], false);

-출력 :

let obj = {
    a: {
        aa: 1,
        ab: {
            aba: 21
        }
    },
    b: 10,
    c: {
        ca: 100,
        cb: 200
    }
};

removeKeysExcept(obj, ['a.ab.aba','c.ca']);
/*OUTPUT: {
    a: {
        ab: {
            aba: 21
        }
    },
    b: 10,
    c: {
        ca: 100,
    }
};*/

removeKeysExcept(obj, ['a.ab.aba','c.ca'], false); //Remove too firt level
/*OUTPUT: {
    a: {
        ab: {
            aba: 21
        }
    },
    c: {
        ca: 100,
    }
};*/

removeKeysExcept(obj);
/*OUTPUT: {b:10};*/

removeKeysExcept(obj, [], false); //Remove too firt level
/*OUTPUT: {};*/

참고 URL : https://stackoverflow.com/questions/19316857/removing-all-properties-from-a-object

반응형