2017-05-10 18 views
1

JS의 기존 코드에 대한 설계 성가심이 있습니다. 코드가 작동하기 때문에 필자는 절대로 그것을 바꿀 서두를 필요가 없지만 아래에 표시된 복제본은 나를 귀찮게합니다. 이 상황을 피하는 통상적 인/권장/공식적인 방법은 무엇입니까? 키/데이터의 중복 방지

var colours={ 
    red:{id:"red", vals:[1,0,0]}, 
     green:{id:"green", vals:[0,1,0]}, 
     grey:{id:"grey", vals:[0.5,0.5,0.5]} 
// ...etc 
    }; 

// id needs to be known internally within the object - thus it is defined as a property. 
// e.g: 
colour.prototype.identify(console.log(this.id)); 

// id also needs to be used externally to find an object quickly. 
// e.g: 
function getcolour(s){return colours[s];} 

// Although this works. It does mean duplicating data, with the theoretical possibility of a mismatch: 
var colours={//... 
     blue:{id:"green", // oh dear... 

방법이가 일반적으로 전문가에 의해 처리 될 것이다 :

실제 시스템은 대형/복잡한 금융 시스템은, 그래서 문제를 보여줍니다 가장 기본적인 예로 단순화된다?

+0

가 [lodash]에보고 (HTTPS를 타고 통과 싶습니다 : //lodash.com/) library –

답변

1

이 질문은 다소 주관적입니다. 내 응용 프로그램을 만들 때

나는 일반적으로 다음합니까 시도 :

  • 여러 위치에 동일한 데이터를 정의하지 않습니다. 소스는 항상 모호하지 않아야합니다.
  • 더 빠르고 쉽게 액세스 할 수 있도록 색인을 만들어야 할 경우 유틸리티 방법을 사용합니다. 그 방법은 적절하게 단위 테스트를 거쳐야합니다. 따라서 잘못된 것들을하는 것에 대해 거의 의심하지 않을 것입니다.
  • 코드의 양을 최소화하기 위해 타사 라이브러리를 최대한 많이 사용하십시오 (예 : lodash 또는 밑줄). 서면/유지.

알고리즘과 유틸리티가 제대로 테스트 된 경우 데이터를 일관성없는 상태로 만드는 것에 대해 (너무 많이) 걱정할 필요가 없습니다. 그러나 이들이 매우 중요한 시스템/인터페이스 인 경우 출력에 대해 유효성을 추가 할 수 있습니다. 일반적으로 입력시 데이터 유효성 검사와 마샬링을 수행하는 것이 좋습니다. 유틸리티 방법에 대한

설명 : 데이터 배열이있는 경우 이, 그리고

var data = [{"id":"i_1", ...}, {"id":"i_2", ...},{"id":"i_3",....}]; 

말을 당신은 당신이 만든 원래 배열에 따라 더 많은 데이터 세트를 그에서 인덱스를 만들거나 만들 필요가 배열에 수정을하거나, 파생 데이터 세트를 작성하거나, 배열에서 반복하고 결과 항목을 즉석에서 작성하는 유틸리티 메소드 라이브러리. 예를 들어 :이 방법은 빠른 데이터에 액세스 할 수있는 해시 맵을 생성합니다

var createIndex = function(arr){ 
    // do something that converts the data array with expected structure to object 
    // { 
    //  i_1: {"id":"i_1", ...}, 
    //  i_2: {"id":"i_2", ...}, 
    //  i_3: {"id":"i_3", ...} 
    return newObj; 
} 

다음 원래 배열을 통해 모든 시간을 반복합니다. 그러나 이제는이 방법을 사용하면 쉽게 단위 테스트를 수행 할 수 있으며 원본 데이터에서 원하는 데이터 집합을 가져올 때 불일치가 발생하지 않도록해야합니다.

+0

1 점에 동의 - 내가 그 질문을 한 전체 이유입니다. '유틸리티 메소드'가 색상 [s]보다 빠른 액세스를 부여하는 방법에 대해 자세히 설명해 줄 수 있습니까? 나는 네 생각의 기차를 따라 가지 않는다. – Richard

+0

@ 리차드는 답변에 명확한 설명을 추가했습니다. –

1

나는 중복을 피하기 위해 다른 방법으로 [직접 액세스] 색상을 변경하지 않을 것입니다. 다른 시도는 처리로 이어지고 많은 양의 데이터가 있다고 언급했습니다.

중복되는 내용이 수신되는 데이터를 처리한다고 가정합니다. 네트워크 데이터 소비를 처리하는 예는지도 개체를 거쳐 키에 따라 동적으로 ID를 설정할 수 있습니다. (처리 대 트래픽)

colours[key].id = key 
+0

질문이 명확하지 않으면 용서해주십시오. 중복 객체가 없습니다. 코드가 정상적으로 작동합니다. 복제는 키가 두 번 저장되므로 이론적으로 일관성이 없을 수 있습니다. 수정해야 할 실제 버그가 없습니다. 단순히 그런 부끄러운 디자인을 피하는 방법에 대한 팁을 찾고있었습니다. – Richard

+0

제가 이해했는데, 당신이 설명한 것처럼 서버에서 데이터가 나오고 있습니까? 그렇다면 누군가와 같은 다른 솔루션이 큰 데이터를 포함 할 때 특히 시간이 걸릴 처리가되기 때문에 때로는 당신과 같은 솔루션을 고수하고 변경하지 않으려 고하는 이유를 설명하려고했습니다. 내가 당신에게 준 예제는 처리를 추가하고 클라이언트에서 처리 할 수있는 불필요한 중복 데이터를 제거합니다 - 녹색 대신 참조 {green : {vals : [0,1,0]} : {id : "green", vals : [0,1,0]} 더 작은 데이터 트래픽 – lastboy

1

개체를 필터링하여 개체 배열로 변환 한 다음 고유 값을 필터링 할 수 있습니다. 이를 배열로 변환하면 많은 작업을보다 빠르고 쉽게 수행 할 수 있습니다.

그래서 당신은 배열로 객체를 매핑 할 수 있습니다 :

var coloursArray = myObj.map(function(value, index) { 
    return [value]; 
}); 

을 제거 중복 :

function removeDuplicates() { 
    return coloursArray.filter((obj, pos, arr) => { 
     return arr.map(mapObj => mapObj[id]).indexOf(obj[id]) === pos; 
    }); 
} 

당신은 예를 들어, 사용하여 배열에서 중복을 제거 할 수는 .uniq method을 통해 underscore.js :

var uniqueColoursArray = _.uniq(coloursArray , function(c){ return c.id; }); 

또한이 기능은 꽤 쓸모가 없습니다. 그것은 또한 getcolour(s)보다 짧은

function getcolour(s){return colours[s];} 

colours[s] 호출 : 당신은 직접 요소에 액세스 할 수 있습니다. 다른 범위에서 액세스 할 수 없기 때문에 배열을 전달하면 함수가 적합합니다. 그런 다음

여기에 매개 변수로 CONSOLE.LOG을 통과 않는 이유를 이해 할 수 없습니다

colour.prototype.identify(console.log(this.id)); 

어쩌면 그냥 this.id

+0

나는이 문제를 충분히 명확하게 설명하지 않았 음을 두려워합니다. 배열에서 중복 요소를 제거하려고하지 않습니다. 데이텀 (id)이 두 개의 개별적인 장소에 저장 됨으로써 중복된다는 것을 염려합니다 : 둘러싸는 객체의 키와 자식 객체의 속성입니다. 나는 이것을 피할 간과 한 영리한 설계 방법이 있는지 궁금합니다. – Richard

+0

예, 확실하지 않았습니다. 다음과 같이 디자인을 변경하면됩니다. var colors = [ {id : "red", vals : [1,0,0]}, {id : "green", vals : [0,1,0] }, {id : "회색", 값 : [0.5,0.5,0.5]} ]; – quirimmo