首页 > 解决方案 > 我可以将特定数据添加到对象的属性吗?

问题描述

我知道下面的代码不正确,但我认为它会表明意图。这可能吗?我希望这个函数更新原始数组,所有 orderno 的格式都是 000.0.000.00000.0。

let cars= [ 
  {orderno: "5766302385925", make: "Alfa", dealership: "NA"},
  {orderno: "4663873261390", make: "Merc", dealership: "NA"},
  {orderno: "8458821291579" , make: "BMW", dealership: "EU"},
  {orderno: "3376768687480", make: "Ford", dealership: "NA"},
  {orderno: "5186132840921", make: "Buick", dealership: "EU"},
];

function addOrderDot() {
    for (var i=0; i<cars.length; i++) {
    cars.orderno[i].splice(2,0,'.')
    cars.orderno[i].splice(3,0,'.')
    cars.orderno[i].splice(6,0,'.')
    cars.orderno[i].splice(11,0,'.')
    } 
}

函数后所需的数组:

let cars= [ 
  {orderno: "576.6.302.38592.5", make: "Alfa", dealership: "NA"},
  {orderno: "466.3.873.26139.0", make: "Merc", dealership: "NA"},
  {orderno: "845.8.821.29157.9" , make: "BMW", dealership: "EU"},
  {orderno: "337.6.768.68748.0", make: "Ford", dealership: "NA"},
  {orderno: "518.6.132.84092.1", make: "Buick", dealership: "EU"},
];

标签: javascriptarraysfunctionobject

解决方案


更优雅的解决方案是使用简单的正则表达式来替换每个字符串:

let cars= [ 
  {orderno: "5766302385925", make: "Alfa", dealership: "NA"},
  {orderno: "4663873261390", make: "Merc", dealership: "NA"},
  {orderno: "8458821291579" , make: "BMW", dealership: "EU"},
  {orderno: "3376768687480", make: "Ford", dealership: "NA"},
  {orderno: "5186132840921", make: "Buick", dealership: "EU"},
];

function addOrderDot() {
    cars.forEach(car => {
       car.orderno = car.orderno.replace(
      /^(.{3})(.{1})(.{3})(.{5})(.{1})$/,
      `$1.$2.$3.$4.$5`
    )
    })
}

解释:我们遍历汽车数组的元素,并将 orderno 数字逻辑分组为 5 组。

在正则表达式中,^ 表示字符串的开头,() 定义了我们以后可以用作变量的逻辑组,.{number} 表示字符数,$ 表示字符串的结尾。所以我们的正则表达式将一组 3 个字符分隔为 $1,一组 1 个字符分隔为 $2,依此类推。然后我们只需将初始字符串替换为“缝合”的逻辑组。

RegExp 一开始可能看起来有点混乱,但在处理字符串和明显的模式时可能是一个很好的工具。


推荐阅读