我想根据用户输入生成一个字符串,它应该看起来像:1234-2016-abc12-3232,我有7个选项,如roll_number,user_id,user_name,year,department,class,subject_code。此选项的顺序是用户定义的。例如:用户可以先说我想要user_name,然后再说subject_code然后再说roll_number,依此类推,用户还可以从特定选项中选择他想要多少个字符,这意味着他可以说出roll_number的最后2个字符,user_name的前3个字符,依此类推。

===我尝试过的===

首先,我捕获了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且用户从右侧选择长度为3,则应该给出456的对齐信息,因此这是左右信息。

第四个数组是:

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


===然后===

此选项的值:

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


现在使用for loop我得到了选项的名称,然后我尝试获取序列,但是我无法获取特定选项的序列,因为我在for loop内部,并且我不确定我应该先获取序列还是选项名称首先,如果您对我有任何简单的方法或指南,请帮忙,我的观点是我需要在循环内运行循环,但我不知道如何?谢谢。

==编辑==

我的循环代码是

            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']);
            }


在此之后该怎么办我不明白。

最佳答案

首先,您可以对sequence进行排序,然后使用Array.prototype.reduce计算每个lengthalignmentselectedOptions并将其连接到所需的字符串:

下面的演示:



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是否超过输入值的大小。

编辑:

因此,如果要放置padding0以防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);

10-06 15:54
查看更多