2014-10-28 95 views
0

我正在使用Lodash來簡化操作對象。我有一個有三個嵌套對象的對象。我想循環這些,將所有可能的組合中的所有孩子連接在一起,而每個列表只使用一個。迭代嵌套對象並使用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 2014-10-28 11:36:43

+0

那裏的優秀點。順序並不重要。我已經修改了我的問題來澄清這一點。 – gosseti 2014-10-28 11:49:39

+0

看來你想從3組中取出一個排列 – Amitesh 2014-10-28 12:11:53

回答

1

Store中的屬性的對象作爲數組的數組值:

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 randomElement(array) { 
    return array[Math.floor(Math.random() * array.length)]; 
} 

實現一個功能選擇從一個數組的數組隨機元素作爲一個連接字符串:

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

現在你可以做這樣的事情得到所需的輸出:

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]]