用于从元素生成矩阵对列表的算法

时间:2017-08-23 13:12:23

标签: javascript algorithm

我不知道如何制定权利。但我需要做下一件事。

我们有下一个数据结构:

a = [
    {
    name: "size",
    'values': ['S', 'M', 'L']
    },
    {
    name: 'color',
    'values': ['B', 'G', 'Y'],
    },
    {
    name: 'material',
    'values': ['X', 'Y']
    }
]

从此需要生成下一个数组:

['SBX', 'SBY', 'SGX', 'SGY', 'SYX', 'SYY', 'MBX, 'MBY', ..., 'LYY']

我的任务中是否存在一些算法?或简单的例子。谢谢!

3 个答案:

答案 0 :(得分:0)

我这样做:



let a = [
    {
       name: "size",
       'values': ['S', 'M', 'L']
    },
    {
       name: 'color',
       'values': ['B', 'G', 'Y'],
    },
    {
       name: 'material',
       'values': ['X', 'Y']
    }
]

let output = []

a[0].values.forEach( size => {
	a[1].values.forEach( color => {
		a[2].values.forEach( material =>{
			output.push(size+color+material)
		})
	})
})

console.log(output) // ['SBX', 'SBY', 'SGX', 'SGY', 'SYX', 'SYY', 'MBX, 'MBY', ..., 'LYY']




答案 1 :(得分:0)

首先:将您的值组合在一个数组中。你可以使用Array#reduce

来做到这一点
var a = [
    {
    name: "size",
    'values': ['S', 'M', 'L']
    },
    {
    name: 'color',
    'values': ['B', 'G', 'Y'],
    },
    {
    name: 'material',
    'values': ['X', 'Y']
    }
]
// Merge values together in one array
var values = a.reduce((acc, item) => {
    acc.push(item.values);
    return acc;
}, []);

然后使用辅助函数生成可能的值。

从此SO answer复制:

// Helper function
function allPossibleCases(arr) {
    if (arr.length == 1) {
    return arr[0];
    } else {
    var result = [];
    var allCasesOfRest = allPossibleCases(arr.slice(1));  // recur with the rest of array
    for (var i = 0; i < allCasesOfRest.length; i++) {
        for (var j = 0; j < arr[0].length; j++) {
        result.push(arr[0][j] + allCasesOfRest[i]);
        }
    }
    return result;
    }  
}

然后将你的大数组传递给这个函数

var outPut = allPossibleCases(values);

所有代码:

var a = [{
        name: "size",
        'values': ['S', 'M', 'L']
    },
    {
        name: 'color',
        'values': ['B', 'G', 'Y'],
    },
    {
        name: 'material',
        'values': ['X', 'Y']
    }
]
// Merge values together in one array
var values = a.reduce((acc, item) => {
    acc.push(item.values);
    return acc;
}, []);

// Helper function
function allPossibleCases(arr) {
    if (arr.length == 1) {
        return arr[0];
    } else {
        var result = [];
        var allCasesOfRest = allPossibleCases(arr.slice(1)); // recur with the rest of array
        for (var i = 0; i < allCasesOfRest.length; i++) {
            for (var j = 0; j < arr[0].length; j++) {
                result.push(arr[0][j] + allCasesOfRest[i]);
            }
        }
        return result;
    }
}

var outPut = allPossibleCases(values);


console.log(outPut);
/*
 [
  "SBX",
  "MBX",
  "LBX",
  "SGX",
  "MGX",
  "LGX",
  "SYX",
  "MYX",
  "LYX",
  "SBY",
  "MBY",
  "LBY",
  "SGY",
  "MGY",
  "LGY",
  "SYY",
  "MYY",
  "LYY"
]
*/

答案 2 :(得分:0)

这是一个工作示例,只需处理每个数组,将所有项目连接到现有数组的所有项目并构建一个新数组,然后继续......

&#13;
&#13;
var a = [{
        name: "size",
        'values': ['S', 'M', 'L']
    },
    {
        name: 'color',
        'values': ['B', 'G', 'Y'],
    },
    {
        name: 'material',
        'values': ['X', 'Y']
    }
]

function transformData(arr) {
    var res = [];
    var appendWithExisting = function(exist, curr) {
        var ret = [];
        if (!exist || !exist.length) {
            return curr.slice()
        }
        for (var i = 0; i < curr.length; i++) {
            var b = curr[i];
            for (var j = 0; j < exist.length; j++) {
                ret.push(exist[j] + b);
            }
        }
        return ret;
    }
    for (var idx = 0; idx < arr.length; idx++) {
        res = appendWithExisting(res, arr[idx].values);
    }
    return res;
}

console.log(transformData(a))
&#13;
&#13;
&#13;