【问题标题】:Javascript: Convert string to array of objects?Javascript:将字符串转换为对象数组?
【发布时间】:2018-09-25 21:21:51
【问题描述】:

告诉我,我怎样才能以最佳方式转换字符串,如

const data = "1350, 1351, 1390-1391, 1401, 1402 - 1407";

到一个类似的数组

const range = [
    {
        min: 1350,
        max: 1350,
    },
    {
        min: 1351,
        max: 1351,
    },
    {
        min: 1390,
        max: 1391,
    },
    {
        min: 1401,
        max: 1401,
    },
    {
        min: 1402,
        max: 1407,
    },
];

?

换句话说,您需要使用明确指定这些数字范围的字符串来创建一个数字范围数组。

最明显的可能算法是:

1) 使用分隔符分割字符串,

2) 使用命令trim 清除生成的部分中的空格

3) 检查零件是否为数字

4) 如果不是,则使用分隔符-分割部分

5) 使用命令trim 清除获得的部分中的空格,

6) 检查 eq 2 的分量是一个数字

但有没有可能让它更优化、更美观、更有效?

【问题讨论】:

  • 志哈,它对你有用吗?

标签: javascript arrays string type-conversion


【解决方案1】:

试试这样的:

const data = "1350, 1351, 1390-1391, 1401, 1402 - 1407"

const result = data
  .split(/\s*,\s*/)
  .map(pair => {
    const [min, max = min] = pair
      .split(/\s*-\s*/)
      .map(Number)

    return {
      min,
      max
    }
  })

console.log(result)

【讨论】:

  • 不要忘记使用+ 运算符或Number 构造函数来强制数值为数字。
  • @MihaiAlexandru-Ionut 啊,对,没注意,谢谢
【解决方案2】:

您可以使用.split().map()

const data = "1350, 1351, 1390-1391, 1401, 1402 - 1407";

const range = data.split(",").map(s => {
  let [min, max = min] = s.split("-");

  return {min: Number(min), max: Number(max)}
});

console.log(range);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

    【解决方案3】:

    您可以将split 方法与reduce 方法结合使用。

    reduce() 方法对累加器应用一个函数,每个 数组中的元素(从左到右)将其减少为单个 价值。

    另外,使用+ 运算符以强制结果到Number

    const data = "1350, 1351, 1390-1391, 1401, 1402 - 1407";
    const array = data.split(', ').reduce(function(arr, elem){
       var [min, max] = elem.split('-');
       arr.push({
          min : + min,
          max: + (max || min)
       });
       return arr;
    },[]);
    console.log(array);

    【讨论】:

      【解决方案4】:

      我认为简单且易于理解的方法是遍历这些值并检查它们是否具有范围值(带有连字符)并相应地为 range 数组创建对象。

      const data = "1350, 1351, 1390-1391, 1401, 1402 - 1407";
      var range = [];
      data.split(',').forEach((val)=>{
        var obj = {};
        if(val.indexOf('-') === -1 ){
          obj.min = val;
          obj.max = val;
        } else {
          obj.min = val.split('-')[0].trim();
          obj.max = val.split('-')[1].trim();
        }
        range.push(obj);
      });
      
      console.log(range);

      【讨论】:

        【解决方案5】:

        此代码将帮助您。

        const data = "1350, 1351, 1390-1391, 1401, 1402 - 1407";
        var arr = data.split(',');
        const range = [];
        for(var i=0; i< arr.length; i++){
        var b = arr[i].split('-');
        if(!b[1])b[1]=b[0];
        var obj = new Object();
        obj.min = parseInt(b[0]);
        obj.max = parseInt(b[1]);
        range.push(obj);
        }
        console.log(range);

        【讨论】:

          猜你喜欢
          • 2013-04-19
          • 1970-01-01
          • 1970-01-01
          • 2017-08-24
          • 2014-03-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多