用动态长度数组替换多个子字符串的更好方法?

时间:2018-11-08 00:29:43

标签: javascript arrays

我有很多字符串,并且用数组元素替换了“ xxx”。这些阵列可以具有不同的长度。我的代码当前正在运行,但是我不确定这是否是最好的方法。您将如何做或对其进行优化?

var items = [{
    str: 'This is xxx an he is xxx years old ',
    list: ['Frank', '14']
  },
  {
    str: 'xxx and xxx are xxx ',
    list: ['George', 'John', "studying"]
  }
]


items.forEach(item => {
  item.list.forEach(s => {
    item.str = item.str.replace("xxx", s)
  })
  console.log(item.str);
})

2 个答案:

答案 0 :(得分:1)

如果字符串太长或替换字符串中可以包含子字符串"xxx",那么最好使用带有全局修饰符的正则表达式,并使用replace的回调使用索引从数组中选择一项:

items.forEach(item => {
  let index = 0;
  item.str = item.str.replace(/xxx/g, m => item.list[index++]);
});

否则,您的解决方案就可以了。

注释:

1-如果index的数量超过item.list.length中的项目,则可能要检查xxx是否超出item.list。一个安全的解决方案是:

item.str = item.str.replace(/xxx/g, m => item.list[index++] || m);

如果mitem.list[index++],则用undefined替换。

2-如果您不关心突变item.list,那么通过使用shift而不是index可以缩短整个解决方案的时间:

items.forEach(item => item.str.replace(/xxx/g, m => item.list.shift() || m));

示例:

var items = [{
    str: 'This is xxx an he is xxx years old ',
    list: ['Frank', '14']
  },
  {
    str: 'xxx and xxx are xxx ',
    list: ['George', 'John', "studying"]
  }
]


items.forEach(item => {
  let index = 0;
  item.str = item.str.replace(/xxx/g, m => item.list[index++]);
})

console.log(items);

答案 1 :(得分:0)

使用此方法,您可以摆脱每种方法之一。.在这里,您正在“ str”中使用regexp搜索所有“ xxx”,并使用array shift()方法返回并从“ list”中删除第一个元素“数组。

var items = [{
    str: 'This is xxx an he is xxx years old ',
    list: ['Frank', '14']
  },
  {
    str: 'xxx and xxx are xxx ',
    list: ['George', 'John', "studying"]
  }
]


items.forEach(item => {

    item.str = item.str.replace(/xxx/g,function (x) {
        return item.list.shift();
    });

    // item.list.forEach(s => {
    //   item.str = item.str.replace("xxx", s)
    // })

  console.log(item.str);
})