代码之家  ›  专栏  ›  技术社区  ›  eag845

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

  •  2
  • eag845  · 技术社区  · 6 年前

    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 回复  |  直到 6 年前
        1
  •  1
  •   ibrahim mahrir    6 年前

    如果字符串太长或者替换可以有子字符串 "xxx" replace

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

    笔记:

    index 超越 item.list.length 万一还有更多 xxx item.list

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

    替换为 m 如果 item.list[index++] undefined .

    2-如果你不在乎变异 项目列表 shift 指数 :

    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);
        2
  •  0
  •   boateng    6 年前

    你可以用这种方法摆脱一个for-each。。在这里,您将使用“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);
    })