2014-10-28 99 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]]