source

JavaScript 개체를 빠르게 지우려면 어떻게 해야 합니까?

factcode 2022. 9. 18. 09:53
반응형

JavaScript 개체를 빠르게 지우려면 어떻게 해야 합니까?

JavaScript Array를 사용하면 단일 할당으로 빈 상태로 리셋할 수 있습니다.

array.length = 0;

이것에 의해, 어레이는 「비어 있다」라고 보여져 재이용 가능한 상태가 됩니다.또, 제가 알기론, 1개의 「조작」, 즉, 일정한 시간이 됩니다.

JS 오브젝트를 클리어하는 유사한 방법이 있습니까?필드를 반복해서 삭제할 수 있습니다.

for (var prop in obj) { if (obj.hasOwnProperty(prop)) { delete obj[prop]; } }

선형 복잡성이 있습니다.

개체를 버리고 새 개체를 만들 수도 있습니다.

obj = {};

그러나 새로운 오브젝트를 "무차별"으로 작성하면 IE6의 가비지 컬렉션에 문제가 발생합니다(여기 설명 참조).

음, 일을 너무 쉽게 만드는 위험을 무릅쓰고...

for (var member in myObject) delete myObject[member];

...코드의 한 줄에 있는 오브젝트를 청소하는 데 최소한 무서운 괄호만 있으면 꽤 효과적일 것 같습니다.모든 구성원은 가비지로 남기지 않고 완전히 삭제됩니다.

오브젝트 자체를 삭제하는 경우는, 다른 delete()를 실행할 필요가 있습니다.

ES5

ES5 솔루션은 다음과 같습니다.

// for enumerable and non-enumerable properties
Object.getOwnPropertyNames(obj).forEach(function (prop) {
  delete obj[prop];
});

ES6

ES6 솔루션은 다음과 같습니다.

// for enumerable and non-enumerable properties
for (const prop of Object.getOwnPropertyNames(obj)) {
  delete obj[prop];
}

성능

사양에 관계없이 가장 빠른 해결책은 일반적으로 다음과 같습니다.

// for enumerable and non-enumerable of an object with proto chain
var props = Object.getOwnPropertyNames(obj);
for (var i = 0; i < props.length; i++) {
  delete obj[props[i]];
}

// for enumerable properties of shallow/plain object
for (var key in obj) {
  // this check can be safely omitted in modern JS engines
  // if (obj.hasOwnProperty(key))
    delete obj[key];
}

<고객명>for..in얕은 개체 또는 일반 개체에서만 수행되어야 합니다. 삭제 가능한 자체 속성이 아니라 프로토타입으로 상속된 속성을 통과해야 합니다.되어 있는 것이과 같이 합니다.forObject.getOwnPropertyNames더 나은 선택입니다.

질문에 대한 간단한 답변은 "아니오"라고 생각합니다(새로운 오브젝트를 작성하기만 하면 됩니다).

  1. 이 예에서는 길이를 0으로 설정해도 모든 요소가 가비지 수집용으로 남아 있다고 생각합니다.

  2. 자주 사용하는 경우 Object.protype에 추가할 수 있습니다.네, 복잡도는 선형이지만 나중에 가비지 수집을 하지 않는 것은 모두 선형입니다.

  3. 이것이 최선의 해결책입니다.질문과는 관계가 없는 것은 알고 있습니다만, IE6를 계속 지원하려면 얼마나 걸립니까?그것의 사용을 중단하기 위한 많은 캠페인이 있다.

위에 잘못된 부분이 있으면 언제든지 수정해 주세요.

이거 드셔보세요.아래 함수는 개체 속성의 모든 값을 정의되지 않음으로 설정합니다.중첩된 개체에서도 작동합니다.

var clearObjectValues = (objToClear) => {
    Object.keys(objToClear).forEach((param) => {
        if ( (objToClear[param]).toString() === "[object Object]" ) {
            clearObjectValues(objToClear[param]);
        } else {
            objToClear[param] = undefined;
        }
    })
    return objToClear;
};

가장 쉬운 방법:

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

Object.keys는 다음과 같이 개체의 각 키를 배열로 반환합니다.

const user = {
  name: 'John Doe',
  age: 25,
};

Object.keys(user) // ['name', 'age']

forEach는 각 첫 하고, 이 를 사용합니다.delete키워드를 지정하면 오브젝트에서 키가 삭제됩니다.따라서 코드는 각 키에 대한 개체의 키를 삭제합니다.

질문을 요약하자면 IE6 GC 버그로 인한 문제를 가능한 한 피하고 싶은 것입니다.이 버그는 두 가지 원인이 있습니다.

  1. 가비지 수집은 많은 할당마다 한 번씩 발생합니다.따라서 할당이 많을수록 GC가 실행되는 빈도가 높아집니다.
  2. '공중에' 있는 개체가 많을수록 가비지 컬렉션 실행마다 걸리는 시간이 늘어납니다(가비지로 표시된 개체가 전체 개체 목록을 탐색하여 표시되므로).

원인 1의 해결책은 할당 수를 줄이고 새 개체와 문자열을 가능한 한 적게 할당하는 것입니다.

원인 2의 해결책은 '라이브' 객체의 수를 줄이고 문자열과 객체가 더 이상 필요하지 않게 되면 즉시 삭제하고 필요에 따라 새로 만드는 것입니다.

이들 솔루션은 어느 정도 모순됩니다.메모리의 오브젝트 수를 낮게 유지하려면 더 많은 할당과 할당 해제가 필요합니다.반대로, 같은 개체를 계속 재사용하면 필요한 것보다 더 많은 개체를 메모리에 보관해야 할 수 있습니다.


이제 질문 드리겠습니다.개체를 새로 만들거나 모든 속성을 삭제하여 재설정할지 여부: 나중에 개체로 수행할 작업에 따라 달라집니다.

새 속성을 할당할 수 있습니다.

  • 즉시 새 속성을 할당하고 먼저 삭제 또는 지우기를 건너뛸 것을 권장합니다(단, 모든 속성을 덮어쓰거나 삭제하십시오).
  • 오브젝트가 바로 사용되지 않고 나중에 다시 채워질 경우 삭제하거나 늘 할당하고 나중에 새로 만드는 것이 좋습니다.

JScript 개체를 지우고 새 개체처럼 재사용할 수 있는 빠르고 사용하기 쉬운 방법은 없습니다.즉, jthompson이 말한 것처럼, 당신의 질문에 대한 짧은 대답은 '아니오'입니다.

ES7에서 Object.observe를 기대하며 일반적으로 데이터 바인딩에 대해 생각해 볼 수 있는 새로운 사항입니다.고려사항:

var foo={
   name: "hello"
};

Object.observe(foo, function(){alert('modified');}); // bind to foo

foo={}; // You are no longer bound to foo but to an orphaned version of it
foo.name="there"; // This change will be missed by Object.observe()

따라서 이러한 상황에서는 #2가 최선의 선택이 될 수 있습니다.

이 때문에 오랫동안 버그가 발생했기 때문에 빈 객체는 원하지 않았기 때문에 모든 속성을 가진 객체를 원했지만 기본값으로 리셋했습니다.수업의 새로운 인스턴스화 같은 거죠.

let object1 = {
  a: 'somestring',
  b: 42,
  c: true,
  d:{
    e:1,
    f:2,
    g:true,
    h:{
      i:"hello"
    }
  },
  j: [1,2,3],
  k: ["foo", "bar"],
  l:["foo",1,true],
  m:[{n:10, o:"food", p:true }, {n:11, o:"foog", p:true }],
  q:null,
  r:undefined
};

let boolDefault = false;
let stringDefault = "";
let numberDefault = 0;

console.log(object1);
//document.write("<pre>");
//document.write(JSON.stringify(object1))
//document.write("<hr />");
cleanObject(object1);
console.log(object1);
//document.write(JSON.stringify(object1));
//document.write("</pre>");

function cleanObject(o) {
  for (let [key, value] of Object.entries(o)) {
    let propType = typeof(o[key]);

    //console.log(key, value, propType);

    switch (propType) {
      case "number" :
        o[key] = numberDefault;
        break;

      case "string":
        o[key] = stringDefault;
        break;

      case "boolean":
        o[key] = boolDefault;    
        break;

      case "undefined":
        o[key] = undefined;   
        break;

      default:
        if(value === null) {
            continue;
        }

        cleanObject(o[key]);
        break;
    }
  }
}

// EXPECTED OUTPUT
// Object { a: "somestring", b: 42, c: true, d: Object { e: 1, f: 2, g: true, h: Object { i: "hello" } }, j: Array [1, 2, 3], k: Array ["foo", "bar"], l: Array ["foo", 1, true], m: Array [Object { n: 10, o: "food", p: true }, Object { n: 11, o: "foog", p: true }], q: null, r: undefined }
// Object { a: "", b: 0, c: undefined, d: Object { e: 0, f: 0, g: undefined, h: Object { i: "" } }, j: Array [0, 0, 0], k: Array ["", ""], l: Array ["", 0, undefined], m: Array [Object { n: 0, o: "", p: undefined }, Object { n: 0, o: "", p: undefined }], q: null, r: undefined }

소품은 삭제할 수 있지만 변수는 삭제하지 마십시오. delete abc;ES5에서는 무효입니다(strict를 사용하여 슬로우합니다).

GC에 삭제하도록 설정하기 위해 null에 할당할 수 있습니다(속성에 대한 다른 참조가 있는 경우 그렇지 않습니다).

설정length오브젝트의 속성은 아무것도 변경하지 않습니다.(그냥 속성을 설정합니다)

const obj = {
  second: 'hasValue',
  third: false,
  first: null,
  fourth: true
}

const translator = {
  null: '-',
  true: 'OK',
  false: 'NO'
}

const cleanObject = Object.fromEntries(Object.entries(obj).map(([key, value]) => [key, translator[value] || value]));
console.log(cleanObject); //{ second: 'hasValue', third: 'NO', first: '-', fourth: 'OK' }

개체 이름이 BASKET인 경우 BASKET = "로 설정합니다.

언급URL : https://stackoverflow.com/questions/684575/how-to-quickly-clear-a-javascript-object

반응형