JavaScript 개체에서 속성을 제거하려면 어떻게 해야 합니까?

지정된 오브젝트:

let myObject = {
"ircEvent": "PRIVMSG",
"method": "newURI",
"regex": "^http://.*" }; 

속성을 제거하려면 어떻게 해야 합니까?regex다음과 같이 끝나다myObject?

let myObject = {
"ircEvent": "PRIVMSG",
"method": "newURI" }; 


질문에 대한 답변



개체에서 속성을 제거하려면(개체를 변환) 다음과 같이 수행할 수 있습니다.

delete myObject.regex; // or, delete myObject['regex']; // or, var prop = "regex"; delete myObject[prop]; 

데모

var myObject = {
"ircEvent": "PRIVMSG",
"method": "newURI",
"regex": "^http://.*" }; delete myObject.regex;
console.log(myObject);

Stack Overflow 사용자 kangax는 이 제품에 대해 매우 상세한 블로그 포스트를 작성했습니다.delete삭제 이해라는 글을 블로그에 올렸습니다.적극 추천합니다.

일부 키를 제외한 원본의 모든 키를 가진 새 개체를 원하는 경우 파괴 기능을 사용할 수 있습니다.

데모

let myObject = {
"ircEvent": "PRIVMSG",
"method": "newURI",
"regex": "^http://.*" };
// assign the key regex to the variable _ indicating it will be unused const {regex: _, ...newObj} = myObject;
console.log(newObj);
// has no 'regex' key console.log(myObject); // remains unchanged




JavaScript 내의 오브젝트는 키와 값 사이의 맵으로 생각할 수 있습니다.delete연산자는 일반적으로 객체 속성으로 알려진 이러한 키를 한 번에 하나씩 제거하는 데 사용됩니다.

var obj = {
myProperty: 1
} console.log(obj.hasOwnProperty('myProperty')) // true delete obj.myProperty console.log(obj.hasOwnProperty('myProperty')) // false

delete연산자는 메모리를 직접 해방하지 않으며 단순히 값을 할당하는 것과는 다릅니다.null또는undefined속성 자체가 개체에서 제거된다는 점에서 속성으로 이동합니다.삭제된 속성 값이 참조 유형(개체)이고 프로그램의 다른 부분이 여전히 해당 개체에 대한 참조를 보유하고 있는 경우 해당 개체에 대한 참조가 모두 사라질 때까지 해당 개체는 물론 가비지 수집되지 않습니다.

delete는 디스크립터가 설정 가능한 속성으로 마크하는 속성에서만 동작합니다.




해묵은 질문, 현대적인 대답.ECMAScript 6 기능인 객체 파괴 기능을 사용하면 다음과 같이 간단합니다.

const { a, ...rest } = { a: 1, b: 2, c: 3 }; 

또는 질문 예제를 사용하여:

const myObject = {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"}; const { regex, ...newObject } = myObject; console.log(newObject); 

Babel 테스트 에디터에서 동작하고 있는 것을 확인할 수 있습니다.


편집:

동일한 변수에 재할당하려면let:

let myObject = {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"}; ({ regex, ...myObject } = myObject); console.log(myObject); 



var myObject = {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};
delete myObject.regex;
console.log ( myObject.regex); // logs: undefined

이것은 Firefox와 Internet Explorer에서 작동하며, 다른 모든 환경에서 작동한다고 생각합니다.




delete연산자는 개체에서 속성을 제거하는 데 사용됩니다.

const obj = { foo: "bar" };
delete obj.foo; obj.hasOwnProperty("foo"); // false 

어레이의 경우, 이것은 요소를 삭제하는 것과 같지 않습니다.배열에서 요소를 제거하려면Array#splice또는Array#pop. 예:

arr;
 // [0, 1, 2, 3, 4] arr.splice(3,1); // 3 arr;
 // [0, 1, 2, 4] 

세부 사항

엄밀히 말하면 JavaScript에서는 어떤 것도 삭제할 수 없습니다.delete연산자는 개체를 삭제하거나 메모리를 확보하지 않습니다.오히려 오퍼랜드를 다음과 같이 설정합니다.undefined부모 오브젝트를 조작하여 멤버가 사라지도록 합니다.

let parent = {
member: { str: "Hello" } }; let secondref = parent.member;
delete parent.member; parent.member;
// undefined secondref;
// { str: "Hello" } 

오브젝트는 삭제되지 않습니다.참고 자료만.메모리는 개체에 대한 참조가 모두 제거된 경우에만 가비지 컬렉터에 의해 해방됩니다.

또 하나의 중요한 경고는,delete운영자가 구조를 재구성하지 않아 직관적으로 보이지 않는 결과를 얻을 수 있습니다.예를 들어 어레이 인덱스를 삭제하면 “구멍”이 남게 됩니다.

let array = [0, 1, 2, 3]; // [0, 1, 2, 3] delete array[2];
// [0, 1, empty, 3] 

어레이는 객체이기 때문입니다.인덱스는 키와 동일합니다.

let fauxarray = {0: 1, 1: 2, length: 2}; fauxarray.__proto__ = [].__proto__; fauxarray.push(3); fauxarray;

// [1, 2, 3] Array.isArray(fauxarray); // false Array.isArray([1, 2, 3]); // true 

JavaScript에 내장된 함수마다 홀이 있는 배열을 다르게 처리합니다.

  • for..in문은 빈 인덱스를 완전히 건너뜁니다.

  • 천진난만하다for루프는 항복한다.undefined인덱스의 값을 지정합니다.

  • 사용하는 모든 방법Symbol.iterator돌아온다undefined인덱스의 값을 지정합니다.

  • forEach,map그리고.reduce누락된 인덱스는 건너뛰지만 제거되지 않습니다.

예:

let array = [1, 2, 3]; // [1,2,3] delete array[1];
// [1, empty, 3] array.map(x => 0);
// [0, empty, 0] 

그래서…deleteoperator는 배열에서 요소를 제거하는 일반적인 사용 예에 사용할 수 없습니다.어레이에는 요소를 제거하고 메모리를 재할당하기 위한 전용 방법이 있습니다.Array#splice()그리고.Array#pop.

어레이 #스플라이스(start[, deleteCount[, item1[, item2[, …]])])

Array#splice는 배열을 변환하고 삭제된 인덱스를 반환합니다. deleteCount요소가 색인에서 제거됨start,그리고.item1, item2... itemN인덱스에서 배열에 삽입됩니다.start.한다면deleteCount생략 후 요소 시작부터 생략인덱스가 어레이의 끝까지 삭제됩니다.

let a = [0,1,2,3,4] a.splice(2,2) // returns the removed elements [2,3] // ...and `a` is now [0,1,4] 

에는 이름이 비슷하지만 다른 함수도 있습니다.Array.prototype:Array#slice.

어레이 #슬라이스([begin[, end])

Array#slice는 비파괴적이며 지정된 인덱스를 포함하는 새로운 배열을 반환합니다.start로.end.한다면end를 지정하지 않은 채로 두면, 디폴트로 어레이의 말미가 됩니다.한다면endpositive 입니다.정지할 제로 베이스의 논픽스 인덱스를 지정합니다.한다면end음수입니다. 배열 끝에서 카운트백하여 정지할 인덱스를 지정합니다(예: -1은 최종 인덱스를 생략합니다).한다면end <= start그 결과 빈 배열이 됩니다.

let a = [0,1,2,3,4] let slices = [
a.slice(0,2),
a.slice(2,2),
a.slice(2,3),
a.slice(2,5) ]
//
a
[0,1,2,3,4] //
slices[0]
[0 1]- - -
//
slices[1]
- - - - - //
slices[2]
- -[3]- - //
slices[3]
- -[2 4 5] 

어레이 #팝

Array#pop는 배열에서 마지막 요소를 삭제하고 해당 요소를 반환합니다.이 작업을 수행하면 어레이 길이가 변경됩니다.반대의 조작은, 즉,push

어레이 #시프트

Array#shift와 유사하다pop단, 첫 번째 요소를 삭제합니다.반대의 조작은, 즉,unshift.