2014-10-28 3 views
0

오브젝트 조작을 쉽게하기 위해 Lodash를 사용하고 있습니다. 내부에 3 개의 중첩 된 객체가있는 객체가 있습니다. 나는 목록을 통해 하나씩 만 사용하면서 모든 가능한 조합으로 각자의 자녀를 모두 연결하여이를 반복하고 싶습니다.중첩 된 오브젝트를 반복하고 Lodash를 사용하여 문자열에 연결하십시오.

내 목적은 다음과 같습니다 : 나는 좀하고 싶습니다

{ 
    "list_1": { 
    "1": ".cat-3", 
    "2": ".cat-5", 
    "3": ".cat-7" 
    }, 
    "list_2": { 
    "1": ".eyes-blue", 
    "3": ".eyes-brown" 
    }, 
    "list_3": { 
    "1": ".jazz", 
    "2": ".commercial", 
    "3": ".hip-hop" 
    } 
} 

출력은 다음과 같습니다

.cat-3.eyes-blue.jazz 
.cat-3.eyes-blue.commercial 
.cat-3.eyes-blue.hip-hop 

순서는 중요하지 않습니다. 중요한 것은 각 list_ 개체의 값 하나만 문자열에 사용된다는 것입니다. 그래서 예를 들어, 잘 될 것입니다 :

.eyes-blue.jazz.cat-3 
.eyes-blue.cat-3.commercial 
.hip-hop.eyes-blue.cat-3 

그리고 좀 더 예 : 배열의 배열과 같은 속성 객체의

.cat-3.eyes-brown.jazz 
.cat-5.eyes-brown.hip-hop 
.cat-7.eyes-blue.hip-hop 
+0

당신은 속성 * for..in을 * 또는 * Object.keys * 때문에 (같은 것 두의 순서 제외)하지 않는 한 하드 코드 같은 방법을 사용하여 반환되는 순서를 보장 할 수 없습니다 이름을 지정하거나 각 키 세트에 대해 정렬을 적용하면 조합을 임의의 순서로 얻을 수 있습니다. – RobG

+0

우수 포인트. 순서는 중요하지 않습니다. 나는 이것을 명확히하기 위해 나의 질문을 수정했다. – gosseti

+0

각 세트에서 하나씩 3 세트의 순열을 갖고 싶습니다. – Amitesh

답변

1

스토어 값 :

var arrayOfArrays = []; 

_.each(obj, function(item, key) { 
    var itemVals = []; 
    _.each(item, function(item2, key2) { 
    itemVals.push(item2); 
    }); 
    arrayOfArrays.push(itemVals); 
}); 

구현 여기에 설명 된대로 suffle() 기능 : https://stackoverflow.com/a/2450976/2193416

이제
function randomCombination(arrayOfArrays) { 
    var output = ""; 
    _.each(arrayOfArrays, function(innerArray) { 
    output += randomElement(innerArray); 
    }) 
    return output 
} 

은 당신이 좋아하는 무언가를 수행하여 원하는 출력을 얻을 수 있습니다 :

function randomElement(array) { 
    return array[Math.floor(Math.random() * array.length)]; 
} 

가 연결된 문자열로 배열의 배열에서 임의 요소를 선택하는 함수를 구현 : 임의의 배열 요소를 얻을

randomCombination(shuffle(arrayOfArrays)); 

또는, 당신은 그대로 arrayOfArrays을 유지하려는 경우 :

randomCombination(shuffle(arrayOfArrays.slice(0))); 
0

대신 lodash의 zip 함수를 사용하여 그룹화 된 요소의 배열을 만들 수 있습니다. 그룹화 된 요소의 배열은 첫 번째 요소에는 지정된 배열의 첫 번째 요소가 들어 있고, 두 번째 요소에는 지정된 배열의 두 번째 요소가 포함됩니다.

_.zip(['fred', 'barney'], [30, 40], [true, false]); 
// → [['fred', 30, true], ['barney', 40, false]]