2016-11-03 93 views
1

我想根据用户输入生成的字符串不同的参数,它应该是这样的:1234年至2016年,abc12-3232,我有7个选项,如roll_numberUSER_IDUSER_NAME部门subject_code。这个选项的顺序是用户定义的。例如:用户可以说我要USER_NAME第一则subject_code然后roll_number等,用户还可以选择他多少字符想从一个特定的选项意味着他可以说最后2个字符从roll_number,第一从user_name等3个字符。创建一个字符串基于JavaScript

===我试图===

首先我拍摄的所有信息在4阵列:

第一个数组是:

var selectedOptions = ['user_name', 'roll_number', 'subject_code', 'class']; 

所以我就我必须为 字符串创建采取的选项列表。

第二个数组是:

var sequence = [ 
        { key:'user_name', value:2 }, 
        { key:'subject_code', value:3 }, 
        { key:'class', value:1 }, 
        { key:'roll_number', value:4 }, 
       ]; 

此阵列给出选项的序列。

第三阵列是:

var alignment = [ 
      { key:'user_name', value:'left' }, 
      { key:'subject_code', value:'left' }, 
      { key:'class', value:'right' }, 
      { key:'roll_number', value:'left' }, 
     ]; 

它给例如对准的知识如果roll_number是123456和用户从右然后456应采取所选择的长度为3,所以这是左右信息。

第四阵列是:现在使用for loop我得到了

 var user_name = "1234abcd"; 
     var subject_code = "567890"; 
     var class = "2016"; 
     var roll_number = "123"; 

var lengthOfOptions = [ 
      { key:'user_name', value:3 }, 
      { key:'subject_code', value:4 }, 
      { key:'class', value:2 }, 
      { key:'roll_number', value:5 }, 
     ]; 

===接着===

的这个选项的值选项名称,然后我试图获得序列,但我无法获得特定opti的序列因为我在for loop里面,我不确定我应该先获得序列或选项名称,如果你有任何简单的方法或指导方针对我有帮助,我的观点是我需要运行循环内循环,但我不'你知道如何?谢谢。

== ==编辑

我的for循环代码

  sequence.sort(function(a, b) { 
       return parseFloat(a.value) - parseFloat(b.value); 
      }); 
      for (var i = 0; i <= sequence.length - 1; i++){ 
       console.log("The key is :", sequence[i]['key']); 
       console.log("The value is :", sequence[i]['value']); 
      } 

在此之后要做什么,我无法理解。

+0

嗨,你可以张贴的代码为'loop',好吗? – Andrea

回答

1

首先,你可以排序sequence然后用Array.prototype.reduce来计算每个selectedOptionslengthalignment并将其连接到所需字符串:

下面3210

演示:

var selectedOptions = ['user_name', 'roll_number', 'subject_code', 'class']; 
 
var sequence = [{ key:'user_name', value:2 },{ key:'subject_code', value:3 },{ key:'class', value:1 },{ key:'roll_number', value:4 },]; 
 
var alignment = [{ key:'user_name', value:'left' },{ key:'subject_code', value:'left' },{ key:'class', value:'right' },{ key:'roll_number', value:'left' },]; 
 
var lengthOfOptions = [{ key:'user_name', value:3 },{ key:'subject_code', value:4 },{ key:'class', value:2 },{ key:'roll_number', value:5 },]; 
 

 
// input values 
 
var options={user_name:"1234abcd",subject_code:"567890", class:"2016",roll_number:"123"}; 
 

 
var result = sequence.sort(function(a, b) { 
 
    return a.value - b.value; 
 
}).reduce(function(prev, curr) { 
 
    // if sequence elements are selected options 
 
    if (selectedOptions.indexOf(curr.key) !== -1) { 
 
    // find length and alignment 
 
    var length = Math.min(lengthOfOptions.filter(e => e.key == curr.key)[0].value, options[curr.key].length); 
 
    var align = alignment.filter(e => e.key == curr.key)[0].value; 
 

 
    // extract the substring from input 
 
    if (align == "left") { 
 
     prev.push(options[curr.key].slice(0, length)); 
 
    } else { 
 
     prev.push(options[curr.key].slice(-length)); 
 
    } 
 
    return prev; 
 
    } 
 
}, []).join('-'); 
 

 
console.log(result);

注意在计算长度使用的Math.min - 检查是否lengthOption超过输入值的大小。

编辑

所以,如果你想放的0一个padding万一lengthOption比输入值,你可以用这个。干杯!

var selectedOptions = ['user_name', 'roll_number', 'subject_code', 'class']; 
 
var sequence = [{ key:'user_name', value:2 },{ key:'subject_code', value:3 },{ key:'class', value:1 },{ key:'roll_number', value:4 },]; 
 
var alignment = [{ key:'user_name', value:'left' },{ key:'subject_code', value:'left' },{ key:'class', value:'right' },{ key:'roll_number', value:'left' },]; 
 
var lengthOfOptions = [{ key:'user_name', value:3 },{ key:'subject_code', value:4 },{ key:'class', value:2 },{ key:'roll_number', value:5 },]; 
 

 
var options={user_name:"1234abcd",subject_code:"567890", class:"2016",roll_number:"123"}; 
 

 
var result = sequence.sort(function(a, b) { 
 
    return a.value - b.value; 
 
}).reduce(function(prev, curr) { 
 
    if (selectedOptions.indexOf(curr.key) !== -1) { 
 
    var lengthOption = lengthOfOptions.find(e => e.key == curr.key).value; 
 
    var align = alignment.find(e => e.key == curr.key).value; 
 
    var padding = Math.max(lengthOption - options[curr.key].length, 0); 
 
    if (align == "left") { 
 
     prev.push(Array(padding + 1).join(0) + options[curr.key].slice(0, Math.min(lengthOption, options[curr.key].length))); 
 
    } else { 
 
     prev.push(Array(padding + 1).join(0) + options[curr.key].slice(-Math.min(lengthOption, options[curr.key].length))); 
 
    } 
 
    return prev; 
 
    } 
 
}, []).join('-'); 
 

 
console.log(result);

+0

@ArpitMeena让我知道这是否适合你,谢谢! – kukkuz

+0

该代码为我工作,感谢它。我试图在这段代码中做一些修改,就像你在这个虚拟例子中看到的** roll_number **我说的长度应该是'5',但我只有'3'字符,在这种情况下输出只显示为'123',但它应该是'00123',所以我想我需要在'if'条件对齐后再放置一个'if'条件,我是对不对? –

+0

@ArpitMeena这可能会发生任何输入值,不仅是'roll_number' ...所以你想要为所有的前缀零? – kukkuz

1

在你的情况下,roll_number将是空的。因此,你会看到一个连字符在最后字符串的结尾

var selectedOptions = ['user_name', 'roll_number', 'subject_code', 'class']; 
 
var sequence = [{ 
 
    key: 'user_name', 
 
    value: 2 
 
}, { 
 
    key: 'subject_code', 
 
    value: 3 
 
}, { 
 
    key: 'class', 
 
    value: 1 
 
}, { 
 
    key: 'roll_number', 
 
    value: 4 
 
}, ]; 
 

 
var alignment = [{ 
 
    key: 'user_name', 
 
    value: 'left' 
 
}, { 
 
    key: 'subject_code', 
 
    value: 'left' 
 
}, { 
 
    key: 'class', 
 
    value: 'right' 
 
}, { 
 
    key: 'roll_number', 
 
    value: 'left' 
 
}, ]; 
 

 
var lengthOfOptions = [{ 
 
    key: 'user_name', 
 
    value: 3 
 
}, { 
 
    key: 'subject_code', 
 
    value: 4 
 
}, { 
 
    key: 'class', 
 
    value: 2 
 
}, { 
 
    key: 'roll_number', 
 
    value: 5 
 
}, ]; 
 

 
var object = { 
 
    "user_name": "1234abcd", 
 
    "subject_code": "567890", 
 
    "class": "2016", 
 
    "roll_number": "123" 
 
} 
 

 
var result = []; 
 

 
//Iterate each option 
 
for (var i = 0; i < selectedOptions.length; i++) { 
 
    var key = selectedOptions[i]; 
 
    var seq = sequence.filter(function(v, i) { 
 
    return v.key === key; 
 
    })[0].value; //Get the sequence number 
 
    var align = alignment.filter(function(v, i) { 
 
    return v.key === key; 
 
    })[0].value; //Get the alignement value 
 
    var length = lengthOfOptions.filter(function(v, i) { 
 
    return v.key === key; 
 
    })[0].value; //Get the length value 
 

 
    var string = object[key]; //Get the string to modify 
 
    if (align === "left") { 
 
    string = string.slice(length); 
 
    } else { 
 
    string = string.slice(0, string.length - length); 
 
    } 
 

 
    result[seq - 1] = string; //Add the string in an array at the correct sequence index. 
 
} 
 

 
var finalString = result.join("-"); //Concat all the strings with '-' 
 

 
console.log(finalString);

相关问题