배열

2016-10-02 8 views
2

에 hasOwnProperty()를 사용하여 나는 배열에 hasOwnProperty()를 사용할 수 있습니까? 이 배열의 rgba 값은 다음과 같습니다.배열

colors = [[240,120,120,255],[125,222,111,255],[9,56,237,255],[240,120,120,255],[240,120,120,255],[240,120,120,255]] 

배열의 빈도 순으로 정렬하는 개체를 만들고 싶습니다. 나는 여러 가지 조합을 시도하고있다.

우선 내가 사용하여 객체로 배열을 변환하는 생각 :

function toObject(arr) { 
    var rv = {}; 
    for (var i = 0; i < arr.length; ++i){ 
    rv[i] = arr[i]; 
    } 
    //console.log('the array is now this ', rv) 
    return rv; 
} 

을하지만이 같은 반환 내가처럼에 hasOwnProperty를 호출 할 경우

{0:[240,120,120,255],1:[125,222,111,255],2:[9,56,237,255],3:[240,120,120,255],4:[240,120,120,255],5:[240,120,120,255]} 

그래서 내가 궁금하네요을 이?

function reduceColors(passedArray){ 
      var empty = {} 
      return passedArray.filter(function(item){ 
      return empty.hasOwnProperty(item["value"]) 
      }) 
     } 
+0

가 원소를 다른 서브 어레이, 또는 정확한 순차 매치와 순서 자체 공통 가장 요소를 갖는 결과 예상되는 출력 배열에 각각 일치 형제 배열을 연결? 즉, 예상되는 결과는 [240,120,120,255]를 [240,120,120,255] [240,120,120,255]를 [240,120,120,255]가 '중 다음'것이된다 '[125,222,111,255], [9,56,237,255]'또는'[9,56,237,255] [125,222,111,255]' ? – guest271314

+0

첫 번째 사항 먼저; JS에서 '[240,120,120,255] === 240,120,120,255] // <- – Redu

+0

정확한 서열 일치 FALSE'이들은 [R, G, B, A] 색상 값 때문이다. – EJW

답변

1

해시를 사용할 수 있습니다. 당신은 그룹화 할 수 해시와 같은 주문에 같은 값을 가지고 있고 자신의 주파수를 셀 수 배열.

var colors = [[240,120,120,255],[125,222,111,255],[9,56,237,255],[240,120,120,255],[240,120,120,255],[240,120,120,255]]; 
 

 

 
var hashed = []; 
 

 
colors.forEach(function(arr){ 
 
    var id = hash(arr); 
 
    var contains = hashed.find(v => v.id == id); 
 
    if(contains){ 
 
     contains.count++; 
 
    }else{ 
 
     hashed.push({id:id, color:arr , count:1}); 
 
    } 
 
}); 
 

 
hashed.sort(function(a,b){return b.count - a.count;}) 
 

 
console.log(hashed); 
 

 
function hash(arr){ 
 
    var hash = "#"; 
 
    arr.forEach(function(v){ 
 
    hash+=v.toString(16); 
 
    }); 
 
    return hash; 
 
}
이 예에서

, 내가 16 진수로 RGBA 값을 변환하여 해시를 만드는거야, 더 나은 솔루션이처럼 저장하는 것입니다 : 여기

은 예입니다 (16 진수로) 따라서 2 차원 배열 대신 1 차원 배열을 갖게됩니다.

colors 내의 각각의 어레이는 동일한 인덱스의 colors 내 형제 어레이의 각 요소가 포함되어 있는지 확인하는 for 루프 Array.prototype.filter(), Array.prototype.every(), 항등 연산자를 사용
+0

와우! 이 예는 매우 분명하고 훌륭합니다. 그것을 설명하고 작업 코드를 사용해 주셔서 감사합니다. 따라서 이해하기가 쉽습니다. 당신에게 내가 행운을 빌어, 내가 도울 수 기뻐요 @EJW – EJW

+0

감사드립니다. – Titus

0

;

colors = [ 
 
    [240, 120, 120, 255], 
 
    [125, 222, 111, 255], 
 
    [9, 56, 237, 255], 
 
    [240, 120, 120, 255], 
 
    [240, 120, 120, 255], 
 
    [240, 120, 120, 255] 
 
] 
 
var res = []; 
 

 
for (var i = 0; i < colors.length; i++) { 
 
    if (res.length < colors.length) { 
 
    [...res] = [...res, 
 
     ...colors.filter(function(el) { 
 
     return el.every(function(elem, index) { 
 
      return elem === colors[i][index] 
 
     }) 
 
     }) 
 
    ] 
 
    } else { 
 
    break; 
 
    } 
 
} 
 

 
console.log(res);