获取javascript中矩阵的所有可能选项
我在JavaScript中有一个“item”对象,该项可以有如下设置 颜色、大小等 我需要得到一个数组中所有可能的组合 假设我们有一个项目如下所示:获取javascript中矩阵的所有可能选项,javascript,arrays,json,underscore.js,permutation,Javascript,Arrays,Json,Underscore.js,Permutation,我在JavaScript中有一个“item”对象,该项可以有如下设置 颜色、大小等 我需要得到一个数组中所有可能的组合 假设我们有一个项目如下所示: var newItem = { name: 'new item', Settings: [ {name: 'color', values: ['green', 'blue', 'red']}, {name: 'size', values: ['15', '18', '22']}, {
var newItem = {
name: 'new item',
Settings: [
{name: 'color', values: ['green', 'blue', 'red']},
{name: 'size', values: ['15', '18', '22']},
{name: 'gender',values: ['male', 'female']}
]
};
我需要以某种方式得到这个:
[
[{SettingName:'color',value:'green'},{SettingName:'size',value:'15'},{SettingName:'gender',value:'male'}],
[{SettingName:'color',value:'blue'},{SettingName:'size',value:'15'},{SettingName:'gender',value:'male'}],
[{SettingName:'color',value:'red'},{SettingName:'size',value:'15'},{SettingName:'gender',value:'male'}],
[{SettingName:'color',value:'green'},{SettingName:'size',value:'18'},{SettingName:'gender',value:'male'}],
[{SettingName:'color',value:'blue'},{SettingName:'size',value:'18'},{SettingName:'gender',value:'male'}],
[{SettingName:'color',value:'red'},{SettingName:'size',value:'18'},{SettingName:'gender',value:'male'}],
[{SettingName:'color',value:'green'},{SettingName:'size',value:'22'},{SettingName:'gender',value:'male'}],
[{SettingName:'color',value:'blue'},{SettingName:'size',value:'22'},{SettingName:'gender',value:'male'}],
[{SettingName:'color',value:'red'},{SettingName:'size',value:'22'},{SettingName:'gender',value:'male'}],
[{SettingName:'color',value:'green'},{SettingName:'size',value:'15'},{SettingName:'gender',value:'female'}],
[{SettingName:'color',value:'blue'},{SettingName:'size',value:'15'},{SettingName:'gender',value:'female'}],
[{SettingName:'color',value:'red'},{SettingName:'size',value:'15'},{SettingName:'gender',value:'female'}],
[{SettingName:'color',value:'green'},{SettingName:'size',value:'18'},{SettingName:'gender',value:'female'}],
[{SettingName:'color',value:'blue'},{SettingName:'size',value:'18'},{SettingName:'gender',value:'female'}],
[{SettingName:'color',value:'red'},{SettingName:'size',value:'18'},{SettingName:'gender',value:'female'}],
[{SettingName:'color',value:'green'},{SettingName:'size',value:'22'},{SettingName:'gender',value:'female'}],
[{SettingName:'color',value:'blue'},{SettingName:'size',value:'22'},{SettingName:'gender',value:'female'}],
[{SettingName:'color',value:'red'},{SettingName:'size',value:'22'},{SettingName:'gender',value:'female'}]
]
这是一个很好的面试问题。
有关运行示例,请参见
getAllPermutations(newItem);
function getAllPermutations(item) {
var permutations = [];
getAllPermutations0(item, permutations, []);
console.log(permutations);
}
function getAllPermutations0(item, permutations, array) {
if (array && array.length === item.Settings.length) {
permutations.push(array.slice()); // The slice clone the array
return;
}
var index = array.length;
var setting = item.Settings[index];
for (var i = 0; i < setting.values.length; i++) {
if (index === 0)
array = [];
var currValue = setting.values[i];
array.push({
SettingName: setting.name,
value: currValue
});
getAllPermutations0(item, permutations, array);
array.pop(); // pop the old one first
}
}
getAllPermutations(newItem);
函数getAllPermutations(项){
var置换=[];
getAllPermutations0(项,排列,[]);
控制台日志(排列);
}
函数getAllPermutations0(项、置换、数组){
if(array&&array.length==item.Settings.length){
permutations.push(array.slice());//切片克隆数组
返回;
}
var指数=数组长度;
变量设置=项目设置[索引];
对于(变量i=0;i
这里是一个非递归解决方案。它接受一个空的或现有的设置
“矩阵”和一个值
数组,并返回一个新矩阵,作为为每个新值克隆的现有矩阵内容的组合,附加成对的新值设置项
[A]
->[1,2]
给出了[A][1][A][2]
[A][1][A][2]
->[X,Y]
给出了[A][1][X][A][2][Y][A][2][X][A][1][Y]
等等
function processSettings(settings, name, values) {
if (settings.length == 0) {
values.forEach(function(value) {
settings.push( [{ SettingName: name, value: value }] )
})
} else {
var oldSettings = JSON.parse(JSON.stringify(settings)), settings = [], temp, i = 0
for (i; i<values.length; i++) {
temp = JSON.parse(JSON.stringify(oldSettings))
temp.forEach(function(setting) {
setting.push( { SettingName: name, value: values[i] } )
settings.push(setting)
})
}
}
return settings
}
您可以使用
Array.prototype.map()
,for
循环,while
循环,Array.prototype.concat()
。迭代gender
值;从索引0
开始依次选择color
,size
值;从当前性别
迭代最远相邻数组,增加最近相邻数组的索引;合并生成的两个性别
数组,形成一个包含性别
、颜色
、大小
var colors = newItem.Settings[0].values;
var sizes = newItem.Settings[1].values;
var gen = newItem.Settings[2].values;
var i = sizes.length;
var res = [].concat.apply([], gen.map(function(value, key) {
var next = -1;
var arr = [];
for (var curr = 0; curr < i; curr++) {
while (next < i - 1) {
arr.push([{
SettingName: "gender",
value: value
}, {
SettingName: "size",
value: sizes[curr]
}, {
SettingName: "color",
value: colors[++next]
}])
}
next = -1;
}
return arr
}))
var colors=newItem.Settings[0]。值;
变量大小=newItem.Settings[1]。值;
var gen=newItem.Settings[2]。值;
var i=尺寸。长度;
var res=[].concat.apply([],gen.map(函数(值,键){
var-next=-1;
var-arr=[];
对于(var curr=0;curr
var newItem={
“名称”:“新项目”,
“设置”:[{
“名称”:“颜色”,
“价值观”:[
“绿色”,
“蓝色”,
“红色”
]
}, {
“名称”:“大小”,
“价值观”:[
"15",
"18",
"22"
]
}, {
“姓名”:“性别”,
“价值观”:[
“男性”,
“女性”
]
}]
}
var colors=newItem.Settings[0]。值;
变量大小=newItem.Settings[1]。值;
var gen=newItem.Settings[2]。值;
var i=尺寸。长度;
var res=[].concat.apply([],gen.map(函数(值,键){
var-next=-1;
var-arr=[];
对于(var curr=0;curr
使用数组.prototype.reduce()
,数组.prototype.sort()
,对象.keys()
,for
循环,while
循环的方法
var newItem={
名称:'新项目',
设置:[
{
名称:'颜色',
值:[“绿色”、“蓝色”、“红色”]
},
{
名称:'大小',
值:['15','18','22']
},
{
姓名:'性别',
值:[“男性”、“女性”]
}
]
};
var props=[“设置名称”,“值”];
var settings=newItem.settings;
功能p(设置、道具){
var数据=设置.reduce(函数(res、设置、索引){
var name=setting.name;
var obj={};
obj[name]=设置值;
res.push(obj);
返回res.length
这很好,但我更喜欢另一个答案,因为它没有使用JSON.parse(JSON.stringify(settings)),但在经过测量之后,我发现这种方法的速度快了3倍(可能只是JSbin vs JSfiddle)嘿@CMS,我想不是-脚本是在你的浏览器中执行的…我不知道,关于JSON.parse(JSON.stringify(settings))
速度极其缓慢的神话,可能是h
[
[{"SettingName":"color","value":"green"},{"SettingName":"size","value":"15"},{"SettingName":"gender","value":"male"}],
[{"SettingName":"color","value":"blue"},{"SettingName":"size","value":"15"},{"SettingName":"gender","value":"male"}],
[{"SettingName":"color","value":"red"},{"SettingName":"size","value":"15"},{"SettingName":"gender","value":"male"}],
[{"SettingName":"color","value":"green"},{"SettingName":"size","value":"18"},{"SettingName":"gender","value":"male"}],
[{"SettingName":"color","value":"blue"},{"SettingName":"size","value":"18"},{"SettingName":"gender","value":"male"}],
[{"SettingName":"color","value":"red"},{"SettingName":"size","value":"18"},{"SettingName":"gender","value":"male"}],
[{"SettingName":"color","value":"green"},{"SettingName":"size","value":"22"},{"SettingName":"gender","value":"male"}],
[{"SettingName":"color","value":"blue"},{"SettingName":"size","value":"22"},{"SettingName":"gender","value":"male"}],
[{"SettingName":"color","value":"red"},{"SettingName":"size","value":"22"},{"SettingName":"gender","value":"male"}],
[{"SettingName":"color","value":"green"},{"SettingName":"size","value":"15"},{"SettingName":"gender","value":"female"}],
[{"SettingName":"color","value":"blue"},{"SettingName":"size","value":"15"},{"SettingName":"gender","value":"female"}],
[{"SettingName":"color","value":"red"},{"SettingName":"size","value":"15"},{"SettingName":"gender","value":"female"}],
[{"SettingName":"color","value":"green"},{"SettingName":"size","value":"18"},{"SettingName":"gender","value":"female"}],
[{"SettingName":"color","value":"blue"},{"SettingName":"size","value":"18"},{"SettingName":"gender","value":"female"}],
[{"SettingName":"color","value":"red"},{"SettingName":"size","value":"18"},{"SettingName":"gender","value":"female"}],
[{"SettingName":"color","value":"green"},{"SettingName":"size","value":"22"},{"SettingName":"gender","value":"female"}],
[{"SettingName":"color","value":"blue"},{"SettingName":"size","value":"22"},{"SettingName":"gender","value":"female"}],
[{"SettingName":"color","value":"red"},{"SettingName":"size","value":"22"},{"SettingName":"gender","value":"female"}]
]
var colors = newItem.Settings[0].values;
var sizes = newItem.Settings[1].values;
var gen = newItem.Settings[2].values;
var i = sizes.length;
var res = [].concat.apply([], gen.map(function(value, key) {
var next = -1;
var arr = [];
for (var curr = 0; curr < i; curr++) {
while (next < i - 1) {
arr.push([{
SettingName: "gender",
value: value
}, {
SettingName: "size",
value: sizes[curr]
}, {
SettingName: "color",
value: colors[++next]
}])
}
next = -1;
}
return arr
}))