2014-03-06 4 views
1
var groupArrays = { 
    "group1" : [ 
     "volvo", 
     "bmw", 
     "audi" 
    ], 
    "group2" : [ 
     "red" 
    ], 
    "group3" : [ 
     "1991" 
    ] 
}; 

이 개체는 자동차 목록을 필터링 한 후에 만들어지며, 필터링 된 요소를 표시하기 위해 javascript에서 사용할 CSS 선택기를 만들고 싶습니다.개체를 배열에 연결

이 그룹의 수를 알 수없는 경우 selectors 배열을 만들려면 여기 가장 쉬운 방법은 무엇입니까
var selectors = [".volvo.red.1991", ".bmw.red.1991", ".audi.red.1991"]; 

: 그러니까 기본적으로 내가 원하는 것은이 같은 수 선택기와 배열, 뭔가입니까?

+1

그룹핑 패턴이 무엇인지 이해하려면 더 많은 데이터를 표시해야합니다. 그룹 2 또는 그룹 3에 하나 이상의 아이템이 있다면 무엇을합니까? 선택기를 작성하기 위해 알고리즘이 무엇인지는 분명하지 않습니다. group1, group2 및 group3의 가능한 모든 조합을 작성하려고합니까? – jfriend00

+0

그 생각의 연속 : 사용자가 브랜드를 선택하지 않았다면 어떻게 될까요? 나는 당신의 문제가 몇 개의 중첩 된 루프로 우아하게 해결 될 수 있다고 생각하지 않는다. 필터 설계를 고려한다면 왜 우리는 1991 년이나 '레드'를 세 번 선택해야합니까? –

답변

1
var groupArrays = { 
    "group1": [ 
     "volvo", 
     "bmw", 
     "audi" 
    ], 
    "group2": [ 
     "red" 
    ], 
    "group3": [ 
     "1991" 
    ] 
}; 

var selectors = []; 
var selector; 

for (var g1 = 0; g1 < groupArrays.group1.length; g1++) { 
    for (var g2 = 0; g2 < groupArrays.group2.length; g2++) { 
     for (var g3 = 0; g3 < groupArrays.group3.length; g3++) { 
      selector = "." + groupArrays.group1[g1] + 
         "." + groupArrays.group2[g2] + 
         "." + groupArrays.group3[g3]; 
      selectors.push(selector); 
     } 
    } 
} 

console.log(selectors); 

JS Fiddle

그룹

var groupArrays = { 
    "group1": [ 
     "volvo", 
     "bmw", 
     "audi" 
    ], 
    "group2": [ 
     "red","green" 
    ], 
    "group3": [ 
     "1991","1992" 
    ] 
}; 

var selectors = []; 
var values = []; 
var ga = []; 

for (var group in groupArrays) { 
    ga.push(groupArrays[group]); 
} 

traverse(ga, 0); 

console.log(selectors); 

function traverse(ga, index) { 
    if (index >= ga.length) { 
     selectors.push("." + values.join(".")); 

     return; 
    } 

    var hold = ga[index].slice(0); 
    var gacopy = ga[index]; 

    while(gacopy.length > 0) { 
     var pickedValue = gacopy[gacopy.length - 1]; 
     values.push(pickedValue); 
     gacopy.pop(); 

     traverse(ga, index + 1); 

     values.splice(values.indexOf(pickedValue), 1); 
    } 

    ga[index] = hold; 
} 
임의의 수의 업데이트 된 코드는

JS Fiddle

+0

그룹 수가 알려지지 않았습니다. – halliewuud

+0

@halliewuud, 업데이트 된 코드 참조. –

0

단순한 일련의 중첩 루프가이를 수행합니다. 하지만 클래스의 숫자로 시작하는1991 클래스에 문제가있을 수 있습니다. 당신이 groupArrays 항목의 알 수없는 번호가있는 경우

var selectors = []; 
var i = groupArrays.group1.length, 
    j, 
    k; 
while (i--) { 
    j = groupArrays.group2.length; 
    while (j--) { 
     k = groupArrays.group3.length; 
     while (k--) { 
      selectors.push(
       '.' + groupArrays.group1[i] + 
       '.' + groupArrays.group2[j] + 
       '.' + groupArrays.group3[k] 
      ); 
     } 
    } 
} 
selectors; // [".audi.red.1991", ".bmw.red.1991", ".volvo.red.1991"] 

, 당신은 그것을 통해 for..in 루프가 필요하고 그 결과 키 재귀 수 있습니다.

+0

그룹 수가 알려지지 않았습니다. – halliewuud

0

당신은 map 기능을 사용할 수 있습니다

var selectors = []; 
groupArrays["group1"].map(function(x) { 
    groupArrays["group2"].map(function(y) { 
     groupArrays["group3"].map(function(z) { 
        selectors.push('.' + x + '.' + y + '.' + z)})})}); 
+0

그룹 수를 알 수 없음 – halliewuud

관련 문제