首页 新闻 会员 周边 捐助

JavaScript ? 多个数组拼接生成不重复字符串【挑战最简代码】

0
悬赏园豆:50 [已解决问题] 解决于 2017-04-11 14:48

已知objectA如何生成result

var objectA =
{
'A': [{ 'name': 'A1' }, { 'name': 'A2' }],
'B': [{ 'name': 'B1' }, { 'name': 'B2' }],
'C': [{ 'name': 'C1' }, { 'name': 'C2' }, { 'name': 'C3' }],
'D': [{ 'name': 'D1' }, { 'name': 'D2' }],
'E': [{ 'name': 'E1' }, { 'name': 'E2' }]
};

var result = [
'A1:B1:C1:D1:E1',
'A1:B1:C1:D1:E2',
'A1:B1:C1:D2:E1',
'A1:B1:C1:D2:E2',
'A1:B1:C2:D1:E1',
'A1:B1:C2:D1:E2',
'A1:B1:C2:D2:E1',
'A1:B1:C2:D2:E2',
'A1:B1:C3:D1:E1',
'A1:B1:C3:D1:E2',
'A1:B1:C3:D2:E1',
'A1:B1:C3:D2:E2',
'A1:B2:C1:D1:E1',
'A1:B2:C1:D1:E2',
'A1:B2:C1:D2:E1',
'A1:B2:C1:D2:E2',
'A1:B2:C2:D1:E1',
'A1:B2:C2:D1:E2',
'A1:B2:C2:D2:E1',
'A1:B2:C2:D2:E2',
'A1:B2:C3:D1:E1',
'A1:B2:C3:D1:E2',
'A1:B2:C3:D2:E1',
'A1:B2:C3:D2:E2',
'A2:B1:C1:D1:E1',
'A2:B1:C1:D1:E2',
'A2:B1:C1:D2:E1',
'A2:B1:C1:D2:E2',
'A2:B1:C2:D1:E1',
'A2:B1:C2:D1:E2',
'A2:B1:C2:D2:E1',
'A2:B1:C2:D2:E2',
'A2:B1:C3:D1:E1',
'A2:B1:C3:D1:E2',
'A2:B1:C3:D2:E1',
'A2:B1:C3:D2:E2',
'A2:B2:C1:D1:E1',
'A2:B2:C1:D1:E2',
'A2:B2:C1:D2:E1',
'A2:B2:C1:D2:E2',
'A2:B2:C2:D1:E1',
'A2:B2:C2:D1:E2',
'A2:B2:C2:D2:E1',
'A2:B2:C2:D2:E2',
'A2:B2:C3:D1:E1',
'A2:B2:C3:D1:E2',
'A2:B2:C3:D2:E1',
'A2:B2:C3:D2:E2'
];

向最简代码发起挑战,你不来试试?

问题补充:

如沧海一杰所言,一句递归就可以搞定,也是春节吃的太多,脑子不灵光了,欠捶啊!

 

var objectA =
{
'A': [{ 'name': 'A1' }, { 'name': 'A2' }],
'B': [{ 'name': 'B1' }, { 'name': 'B2' }],
'C': [{ 'name': 'C1' }, { 'name': 'C2' }, { 'name': 'C3' }],
'D': [{ 'name': 'D1' }, { 'name': 'D2' }],
'E': [{ 'name': 'E1' }, { 'name': 'E2' }]
};
var proArray=Object.getOwnPropertyNames(objectA),
proLen=proArray.length,
result = new Array(),
count;
for (var i = 0; i <proLen ; i++) {
var curPro = objectA[proArray[i]];
count = curPro.length;
if (i == 0) {
for (var c = 0; c < count; c++) {
result.push(curPro[c].name);
}
} else {
var tNameArray = result;
result = [];
for (var b = 0, blen = tNameArray.length; b < blen; b++) {
for (var c = 0; c < count; c++) {
result.push(tNameArray[b] + ':' + curPro[c].name);
}
}
}
}
console.log(result);

mayixue的主页 mayixue | 初学一级 | 园豆:29
提问于:2017-02-17 15:14
< >
分享
最佳答案
1

$(function () {
  //递归
  var loop = function (obj, lastArray,index) {
    return index >= initial.length?lastArray:loop(obj, add(lastArray, obj[initial[index]]), ++index);
  }
  var add = function (lastArray, array) {
    var strResult = [];
    for (var i = 0; i < lastArray.length; i++) {
      for (var j = 0; j < array.length; j++) {
        strResult.push(lastArray[i] + (lastArray[i] == "" ? "": ":") + array[j].name);
      }
    }
    return strResult;
  }  
  var result = [];
  var initial = ['A','B','C','D','E'];//暂时没有好的办法获取到,欢迎补充
  result=loop(objectA, [""], 0);
  console.log(result);
})

 

收获园豆:50
路人第十一 | 菜鸟二级 |园豆:323 | 2017-02-20 16:28

兄台,受教了!代码简洁,逻辑清晰!

用  Object.getOwnPropertyNames(objectA) 可以得到 ['A','B','C','D','E']

mayixue | 园豆:29 (初学一级) | 2017-02-27 09:32

@黒蚁: 我也想了好久,然后实现也是。Object.getOwnPropertyNames(objectA) 这个方法很常见,但我没有使用过,原来是这个意思,多谢了。

路人第十一 | 园豆:323 (菜鸟二级) | 2017-02-27 11:58
其他回答(4)
1

这不就是排列组合算法么,应该一个递归可以搞定。

空明流光 | 园豆:111 (初学一级) | 2017-02-17 16:03

兄台确定?不妨试试,贴出来大家交流交流

支持(1) 反对(0) mayixue | 园豆:29 (初学一级) | 2017-02-17 16:34

@黒蚁: JS调试比较麻烦,要是用C#,我用linq一句代码应该可以搞定。

支持(0) 反对(0) 空明流光 | 园豆:111 (初学一级) | 2017-02-17 16:36

@沧海一杰: 感谢点拨,茅厕蹲开啊。

JS 调试的确不太爽,个人喜好用chrome的开发者工具 Sources+Console 组合调试。

支持(0) 反对(0) mayixue | 园豆:29 (初学一级) | 2017-02-20 15:25
1

想法:

objectA.A,objectA.B,objectA.C,objectA.D,objectA.E这是五个数组,

再五个for循环嵌套输出每个数组的name,输出的数组就是result了

让我发会呆 | 园豆:2929 (老鸟四级) | 2017-02-17 16:44
0

我感觉 有点意思哎 object
A 中的 A1怎么调取 出来呢


Ankermaker | 园豆:251 (菜鸟二级) | 2017-02-18 17:56

有答案了,过来学习下吧

支持(1) 反对(0) mayixue | 园豆:29 (初学一级) | 2017-02-27 09:49
1

js计较麻烦,尝试后觉得只有字符串拼接是最简单的写法。

张云山 | 园豆:642 (小虾三级) | 2017-02-20 10:21

function init(initData){
initData = initData || {};//需要拼接出不重复的数组
var data = [];
var keys = [];
for (var i in initData){
keys.push(i);
};
var newkeys = keys.map(function(e,i,d){
var leng = d.length;
if(i < leng && i > 0){
return d[leng-i];
};
return e;
});
var evalObj = "";
for (var i = 0 ; i < keys.length ; i++){
evalObj += ('for(var '+newkeys[i]+' = 0 ; '+newkeys[i]+' < initData["'+newkeys[i]+'"].length ; '+newkeys[i]+'++){\n');
};
evalObj += "data.push(\n";
for (var i = 0 ; i < keys.length ; i++){
var ex = '+ ":" +';
if(i == keys.length-1){
ex = "";
}
evalObj += 'initData["'+keys[i]+'"]['+keys[i]+'].name'+ex+'\n';
}
evalObj += ")\n";
for (var i = 0 ; i < keys.length ; i++){
evalObj +="}\n";
}
eval(evalObj);
return data;//返回最终数据
}

支持(0) 反对(0) 张云山 | 园豆:642 (小虾三级) | 2017-02-20 10:21

以下是处理过程

 

 

/**
* Created by 张云山 on 2017/2/20.
*/
var objectA =
{
'A': [{ 'name': 'A1' }, { 'name': 'A2' }],
'B': [{ 'name': 'B1' }, { 'name': 'B2' }],
'C': [{ 'name': 'C1' }, { 'name': 'C2' }, { 'name': 'C3' }],
'D': [{ 'name': 'D1' }, { 'name': 'D2' }],
'E': [{ 'name': 'E1' }, { 'name': 'E2' }]
};
var result = [
'A1:B1:C1:D1:E1',//1[0][0]:2[0][0]:3[0][0]:4[0][0]:5[0][0]
'A1:B1:C1:D1:E2',//1[0][0]:2[0][0]:3[0][0]:4[0][0]:5[1][0]
'A1:B1:C1:D2:E1',//1[0][0]:2[0][0]:3[0][0]:4[1][0]:5[0][0]
'A1:B1:C1:D2:E2',//1[0][0]:2[0][0]:3[0][0]:4[1][0]:5[1][0]
'A1:B1:C2:D1:E1',//1[0][0]:2[0][0]:3[1][0]:4[0][0]:5[0][0]
'A1:B1:C2:D1:E2',//1[0][0]:2[0][0]:3[1][0]:4[0][0]:5[1][0]
'A1:B1:C2:D2:E1',//1[0][0]:2[0][0]:3[1][0]:4[1][0]:5[0][0]
'A1:B1:C2:D2:E2',//1[0][0]:2[0][0]:3[1][0]:4[1][0]:5[1][0]
'A1:B1:C3:D1:E1',//1[0][0]:2[0][0]:3[2][0]:4[0][0]:5[0][0]
'A1:B1:C3:D1:E2',//1[0][0]:2[0][0]:3[2][0]:4[0][0]:5[1][0]
'A1:B1:C3:D2:E1',//1[0][0]:2[0][0]:3[2][0]:4[1][0]:5[0][0]
'A1:B1:C3:D2:E2',//1[0][0]:2[0][0]:3[2][0]:4[1][0]:5[1][0]
'A1:B2:C1:D1:E1',//1[0][0]:2[1][0]:3[0][0]:4[0][0]:5[0][0]
'A1:B2:C1:D1:E2',//1[0][0]:2[1][0]:3[0][0]:4[0][0]:5[1][0]
'A1:B2:C1:D2:E1',//1[0][0]:2[1][0]:3[0][0]:4[1][0]:5[0][0]
'A1:B2:C1:D2:E2',//1[0][0]:2[1][0]:3[0][0]:4[1][0]:5[1][0]
'A1:B2:C2:D1:E1',//1[0][0]:2[1][0]:3[1][0]:4[0][0]:5[0][0]
'A1:B2:C2:D1:E2',//1[0][0]:2[1][0]:3[1][0]:4[0][0]:5[1][0]
'A1:B2:C2:D2:E1',//1[0][0]:2[1][0]:3[1][0]:4[1][0]:5[0][0]
'A1:B2:C2:D2:E2',//1[0][0]:2[1][0]:3[1][0]:4[1][0]:5[1][0]
'A1:B2:C3:D1:E1',//1[0][0]:2[1][0]:3[2][0]:4[0][0]:5[0][0]
'A1:B2:C3:D1:E2',//1[0][0]:2[1][0]:3[2][0]:4[0][0]:5[1][0]
'A1:B2:C3:D2:E1',//1[0][0]:2[1][0]:3[2][0]:4[1][0]:5[0][0]
'A1:B2:C3:D2:E2',//1[0][0]:2[1][0]:3[2][0]:4[1][0]:5[1][0]
/*********************************************************/
'A2:B1:C1:D1:E1',//1[1][0]:2[0][0]:3[0][0]:4[0][0]:5[0][0]
'A2:B1:C1:D1:E2',//1[1][0]:2[0][0]:3[0][0]:4[0][0]:5[1][0]
'A2:B1:C1:D2:E1',//1[1][0]:2[0][0]:3[0][0]:4[1][0]:5[0][0]
'A2:B1:C1:D2:E2',//1[1][0]:2[0][0]:3[0][0]:4[1][0]:5[1][0]
'A2:B1:C2:D1:E1',//1[1][0]:2[0][0]:3[1][0]:4[0][0]:5[0][0]
'A2:B1:C2:D1:E2',//1[1][0]:2[0][0]:3[1][0]:4[0][0]:5[1][0]
'A2:B1:C2:D2:E1',//1[1][0]:2[0][0]:3[1][0]:4[1][0]:5[0][0]
'A2:B1:C2:D2:E2',//1[1][0]:2[0][0]:3[1][0]:4[1][0]:5[1][0]
'A2:B1:C3:D1:E1',//1[1][0]:2[0][0]:3[2][0]:4[0][0]:5[0][0]
'A2:B1:C3:D1:E2',//1[1][0]:2[0][0]:3[2][0]:4[0][0]:5[1][0]
'A2:B1:C3:D2:E1',//1[1][0]:2[0][0]:3[2][0]:4[1][0]:5[0][0]
'A2:B1:C3:D2:E2',//1[1][0]:2[0][0]:3[2][0]:4[1][0]:5[1][0]
'A2:B2:C1:D1:E1',//1[1][0]:2[1][0]:3[0][0]:4[0][0]:5[0][0]
'A2:B2:C1:D1:E2',//1[1][0]:2[1][0]:3[0][0]:4[0][0]:5[1][0]
'A2:B2:C1:D2:E1',//1[1][0]:2[1][0]:3[0][0]:4[1][0]:5[0][0]
'A2:B2:C1:D2:E2',//1[1][0]:2[1][0]:3[0][0]:4[1][0]:5[1][0]
'A2:B2:C2:D1:E1',//1[1][0]:2[1][0]:3[1][0]:4[0][0]:5[0][0]
'A2:B2:C2:D1:E2',//1[1][0]:2[1][0]:3[1][0]:4[0][0]:5[1][0]
'A2:B2:C2:D2:E1',//1[1][0]:2[1][0]:3[1][0]:4[1][0]:5[0][0]
'A2:B2:C2:D2:E2',//1[1][0]:2[1][0]:3[1][0]:4[1][0]:5[1][0]
'A2:B2:C3:D1:E1',//1[1][0]:2[1][0]:3[2][0]:4[0][0]:5[0][0]
'A2:B2:C3:D1:E2',//1[1][0]:2[1][0]:3[2][0]:4[0][0]:5[1][0]
'A2:B2:C3:D2:E1',//1[1][0]:2[1][0]:3[2][0]:4[1][0]:5[0][0]
'A2:B2:C3:D2:E2',//1[1][0]:2[1][0]:3[2][0]:4[1][0]:5[1][0]
];
console.log(objectA);
console.log(result.join());
console.log("*************************************************************");
var data = [];
/*
for(var A = 0 ; A < objectA["A"].length ; A++){
for(var E = 0 ; E < objectA["E"].length ; E++) {
for (var D = 0; D < objectA["D"].length; D++) {
for (var C = 0; C < objectA["C"].length; C++) {
for (var B = 0; B < objectA["B"].length; B++){
data.push(
objectA["A"][A].name
+ ":" + objectA["B"][B].name
+ ":" + objectA["C"][C].name
+ ":" + objectA["D"][D].name
+ ":" + objectA["E"][E].name
)
}
}
}
}
}
///*/
function init(initData){
initData = initData || {};//需要拼接出不重复的数组
var data = [];
var keys = [];
for (var i in initData){
keys.push(i);
};
var newkeys = keys.map(function(e,i,d){
var leng = d.length;
if(i < leng && i > 0){
return d[leng-i];
};
return e;
});
var evalObj = "";
for (var i = 0 ; i < keys.length ; i++){
evalObj += ('for(var '+newkeys[i]+' = 0 ; '+newkeys[i]+' < initData["'+newkeys[i]+'"].length ; '+newkeys[i]+'++){\n');
};
evalObj += "data.push(\n";
for (var i = 0 ; i < keys.length ; i++){
var ex = '+ ":" +';
if(i == keys.length-1){
ex = "";
}
evalObj += 'initData["'+keys[i]+'"]['+keys[i]+'].name'+ex+'\n';
}
evalObj += ")\n";
for (var i = 0 ; i < keys.length ; i++){
evalObj +="}\n";
}
eval(evalObj);
return data;//返回最终数据
}
data = init();
console.log(data.join());

支持(0) 反对(0) 张云山 | 园豆:642 (小虾三级) | 2017-02-20 10:23

欢迎更简单的方法分享,哈哈~~~~~~~~~~~

支持(0) 反对(0) 张云山 | 园豆:642 (小虾三级) | 2017-02-20 10:24

@张云山: 感谢云山兄的分享!

十三兄给出的代码很不错,欢迎有时间来交流下。

支持(0) 反对(0) mayixue | 园豆:29 (初学一级) | 2017-02-27 09:35

h好的

支持(0) 反对(0) 张云山 | 园豆:642 (小虾三级) | 2017-02-27 09:37
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册