2016-09-17 5 views
2

목표는 2 차원 자바 스크립트 배열에 동적 'sum'행을 만드는 것입니다. 여기에 출발점입니다 :defineProperty를 통해 javascript에 배열을 추가하는 것이 더 좋은 방법일까요?

var m = [[1,2,3], [4,5,6]]; 

따라서 우리는 세 번째 행을 추가 할 수 있습니다

Object.defineProperty(m, 2, { get:() => m[0].map((e, i)=> e + m[1][i]) }) 

그래서 지금 우리의 배열이 작동

[[1,2,3], [4,5,6], [5,7,9]] 

입니다! m[0][0]=10을 설정하고

[[10,2,3], [4,5,6], [14,7,9]] 

정확히 내가 원하는 것입니다. m.length = 3이 예상대로이므로 합계 행이 배열의 일부로 처리됩니다. JSON.stringify도 예상대로 작동합니다. (나는 약간 놀랐다 그것이 tbh를 움직이게했다).

제 질문은 defineProperty에 의지하지 않고 다른 부품에 종속 된 2 차원 어레이의 부품을 생성하는 방법이 있습니까? 이것은 피할 수있는 것이 있습니까?

참고 - 내 원래의 질문에서 나는 위의 작업을 수행 한 다음 m[2]을 다른 것으로 변경했습니다. '속성'이 배열 구성원을 우회하여 혼란을 겪었습니다.이 자체로 사용하지 않는 이유가 될 수 있습니다. 위의 방법. Apolgies)

+1

더 많은 코드가 표시되어야합니다. 함수가 실행되고있는 곳. –

+1

당신은'[[1, 2, 3], [4, 5, 6], [5, 7, 9]] '를하기 전에'm [2] = m [2]()'를 호출하고 있습니다. – Marcs

답변

2
의미가 있습니다

! 나는 약간 놀랐다. 그것은 tbh 일했다.

예. 배열은 특별한 .length 속성을 가진 단지 객체 일 뿐이지 만 인덱스는 일반적인 속성입니다. 네가 원한다면 세터를 만들 수 있음을 의미한다.

var thirdRowDescriptor = { 
    enumerable: true, 
    configurable: true, 
    get() { 
     return this[0].map((x, i) => x + this[1][i]); 
    } 
}; 
Object.defineProperty(m, 2, thirdRowDescriptor); 
// or use the same descriptor on any other arrays 

이없는 다른 부분에 따라 2 차원 배열의 일부를 생성하는 더 좋은 방법이 있나요 :

, BTW 당신은 ​​m를 참조 항상 게터에 this을 대신 사용하여 해당에 향상시킬 수 있습니다 defineProperty를 사용하고 있습니까?

아니요. Object.defineProperty을 사용하여 만든 게터가 원하는 것일 수 있습니다. 다른 것들에 의존적 인 배열을 동적으로 생성하는 다른 많은 방법들이 있지만, 그것들 중 누구도 실제로 그것을 외부 배열의 "일부분"으로 만들지 않습니다.

이 문제가 발생합니까?

가능합니다. 엔진이 인덱스 액세스를 쉽게 최적화 할 수 없기 때문에 외부 배열 (getter를 추가 한)의 성능을 파괴한다는 것이 확실합니다. 그러나 실제로 하나의 다른 열을 추가하려는 2 열 개체 인 경우 문제가되지 않습니다. 동적으로 커지거나 커지고있는 커다란 배열이나 배열에서는하지 마십시오.어쨌든 구조가 정적 인 경우 외부 구조에 일반 객체 (배열이 아님)를 사용하는 것이 더 나은 선택 일 수 있습니다.

0

다음 결과보기 : m [2]는 함수입니다. 그리고 그 결과는 당신이 말한 것과 같지 않습니다.

m = [[1, 2, 3], [4, 5, 7]]; 
 
m[2] =() => m[0].map((e, i) => e + m[1][i]); 
 

 
console.log(m); 
 
console.log(Array.isArray(m[2])) 
 
console.log(m[2]()); 
 
console.log(typeof(m[2]));

+0

apolgies , 네 말이 맞아, 나는 뭔가를 놓쳤다. 나는 그 질문을 다시 쓰겠다. –

관련 문제