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

JS迭代对象数组并替换字符串中的值

  •  1
  • SBB  · 技术社区  · 8 年前

    我有一个正在使用的javascript对象数组。密钥是动态生成的,数量未知。

    我试图在对象上循环并替换其值中的一段数据。

    下面是一个示例:

    var obj = [{
        name: 'Joe',
        age: 21,
        randomCol1: 'Blah<br>Blah<br>Blah',
        randomCol2: 'Blah<br>Blah<br>Blah',
        randomCol3: 'Blah<br>Blah<br>Blah'
    },
    {
        name: 'Bob',
        age: 25,
        randomCol1: 'Blah<br>Blah<br>Blah',
        randomCol2: 'Blah<br>Blah<br>Blah',
        randomCol3: 'Blah<br>Blah<br>Blah'
    }]
    
    
    for (var key in obj) {
        if (obj.hasOwnProperty(key)) {
            obj[key].replace(/<br>/g,'\r\n')
        }
    }
    

    在对象中,我试图替换 <br> 具有 \r\n 。列名并不总是已知的。

    我应该通过循环或某种类型的映射来实现这一点吗?只需要在将此数据传递到excel导出之前进行转换,在excel导出中我需要使用换行符。

    4 回复  |  直到 8 年前
        1
  •  2
  •   Rahul Desai    8 年前

    我应该通过循环或某种类型的映射来实现这一点吗?

    是的,你确实需要一个循环。一种方法是将两者结合使用-

    • A. map 用于在数组中循环并返回新数组
    • A. for 在贴图中循环以遍历对象中的所有属性

    工作代码段:

    var objArray = [{
        name: 'Joe',
        age: 21,
        randomCol1: 'Blah<br>Blah<br>Blah',
        randomCol2: 'Blah<br>Blah<br>Blah',
        randomCol3: 'Blah<br>Blah<br>Blah'
      },
      {
        name: 'Bob',
        age: 25,
        randomCol1: 'Blah<br>Blah<br>Blah',
        randomCol2: 'Blah<br>Blah<br>Blah',
        randomCol3: 'Blah<br>Blah<br>Blah'
      }
    ];
    
    var newObjArray = objArray.map(function(obj) { // loop through array
    
      for (var key in obj) { // loop through object properties
    
        if (typeof obj[key] === 'string') { // only if the value is a string type
    
          obj[key] = obj[key].replace(/<br>/g, '\r\n'); // same logic as you were using before
    
        }
    
      }
    
      return obj;
    });
    
    console.log(newObjArray);

    注:使用 地图 如果不想更改原始输入数组,而是要生成新的结果数组。否则,请使用 forEach

        2
  •  0
  •   Keith    8 年前

    您的代码有一些问题,。。

    首先,您没有遍历数组,。名称 obj 这里有点误导,因为您有一个数组。

    此外,您还需要在调用replace之前检查类型,例如,age是一个数字,它没有replace方法。

    最后,当您调用replace时,您需要存储结果,即使结果在同一个地方。

    所以,考虑到所有这些因素,下面如果你修改代码做什么,我想你以后。

    var obj = [{
        name: 'Joe',
        age: 21,
        randomCol1: 'Blah<br>Blah<br>Blah',
        randomCol2: 'Blah<br>Blah<br>Blah',
        randomCol3: 'Blah<br>Blah<br>Blah'
    },
    {
        name: 'Bob',
        age: 25,
        randomCol1: 'Blah<br>Blah<br>Blah',
        randomCol2: 'Blah<br>Blah<br>Blah',
        randomCol3: 'Blah<br>Blah<br>Blah'
    }]
    
    
    for (var i = 0; i < obj.length; i += 1) {
      var obj2 = obj[i];
      for (var key in obj2) {
          if (obj2.hasOwnProperty(key)) {
             if (typeof obj2[key] === "string")
                obj2[key] = obj2[key].replace(/<br>/g,'\r\n')
          }
      }
    }
      
    console.log(obj);
        3
  •  0
  •   Taki    8 年前

    循环对象并使用 .replace 如果它是 string

    const obj = [{
        name: 'Joe',
        age: 21,
        randomCol1: 'Blah<br>Blah<br>Blah',
        randomCol2: 'Blah<br>Blah<br>Blah',
        randomCol3: 'Blah<br>Blah<br>Blah'
      },
      {
        name: 'Bob',
        age: 25,
        randomCol1: 'Blah<br>Blah<br>Blah',
        randomCol2: 'Blah<br>Blah<br>Blah',
        randomCol3: 'Blah<br>Blah<br>Blah'
      }
    ]
    
    
    obj.forEach((e) => {
    
      for (let k in e)
        (e[k] && typeof e[k] == 'string') && (e[k] = e[k].replace(/<br>/g, '\n\r'));
    
    });
    
    
    console.log(obj)
        4
  •  0
  •   ibrahim tanyalcin    8 年前

    for或while循环总是更快。但根据阵列的结构和大小,我只需要:

    obj.forEach(function(d,i){
        Object.keys(d).forEach(function(dd,ii){
            typeof d[dd] === "string" && (d[dd] = d[dd].replace(/<br>/g,'\r\n'))
        })
    })