Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取javascript中矩阵的所有可能选项_Javascript_Arrays_Json_Underscore.js_Permutation - Fatal编程技术网

获取javascript中矩阵的所有可能选项

获取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']}, {

我在JavaScript中有一个“item”对象,该项可以有如下设置 颜色、大小等

我需要得到一个数组中所有可能的组合

假设我们有一个项目如下所示:

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
}))