在设置JavaScript对象的所有属性中修剪()空格字符的有效方法是什么?

Jas*_*vis 4 javascript jquery trim

这是一个简化的演示,需要复制我需要做的事情.

在我的JavaScript应用程序中,我在项目任务记录上有一个Click事件.

单击任务时,我使用DOM中与所单击的任务记录相关的数据填充JavaScript对象.

我的问题是,当我从DOM打印出保存到我​​的对象的值时,我的字符串前面和后面总是有大量的空格字符.

在此输入图像描述

我有这个Shim来使用更新的内置JavaScript trim()函数...

/* JavaScript trim() method is ES 5, just in case polyfill it (IE 8 and down):
 * example usage:
 *  var str = " a b    c d e   f g   ";
 *  var newStr = str.trim();
*/
if (!String.prototype.trim) {
  String.prototype.trim = function () {
    return this.replace(/^\s+|\s+$/g, '');
  };
}
Run Code Online (Sandbox Code Playgroud)

下面我为这个问题提出了一个简单的演示.

您将看到存储的JavaScript对象 taskDataObject

(注意:我意识到下面的实际选择器代码很恶心,这是我的待办事项列表中的下一个!)

这个JSFiddle页面包含显示我运行的演示的所有代码:http:
//jsfiddle.net/jasondavis/2hkz0gp4/

.taskName被点击时,它从DOM抓住数据,并将其保存到taskDataObjectJavaScript对象.

我正在寻找一种将此str.trim()代码应用于所有属性的好方法,taskDataObject并希望我不必制作一堆临时变量.

演示代码

//Open Task Modal when a Task record is clicked in Task List
$('body').on('click', '.taskName', function() {


    // Set and Cache Task ID from clicked on Task Item
    var taskId = $(this).parent().parent().parent().dataAttr('task-id');

    var $taskEl = $(this);

    // Populate Task Data Object from DOM values
    taskDataObject = {
        //projectId: projectTaskModal.cache.projectId,
        taskId: taskId,
        taskName: $taskEl.text(),
        taskDescription: $taskEl.next('.description').text(),
        taskStatus: $taskEl.parent().parent('td').next().text(),
        taskPriority: $taskEl.parent().parent('td').next().next().text(),
        taskTags: $taskEl.parent().parent('td').next().next().next().text(),
        taskCreatedDate: $taskEl.parent().parent('td').next().next().next().next().text(),
        taskModifiedDate: $taskEl.parent().parent('td').next().next().next().next().next().text(),
        taskDueDate: $taskEl.parent().parent('td').next().next().next().next().next().next().text(),
    };

    console.log('taskDataObject', taskDataObject);


    // Just playing around, this applies the trim() however I had
    // to create a bunch of temp variables and I am not sure if 
    // this can be avoided or done differently?
    for (var key in taskDataObject) {

      if (taskDataObject.hasOwnProperty(key)) {

        alert(key + " -> " + taskDataObject[key]);

        //console.log(key + " -> " + taskDataObject[key]);

          console.log(taskDataObject[key]);

          var tmpVal1 = taskDataObject[key]
          var tmpVal2 = tmpVal1.trim();

          console.log(tmpVal2);

      }
    }

});
Run Code Online (Sandbox Code Playgroud)

Die*_*cKy 7

如果我理解你的问题,你只需要打电话text().trim()而不是text().text()返回一个String

如果您确实需要为每个属性值执行修剪,请执行以下操作:

for (var key in taskDataObject) {
    if(taskDataObject[key].trim)
       taskDataObject[key] = taskDataObject[key].trim(); 
}
Run Code Online (Sandbox Code Playgroud)

这是一个沿着所有子属性递归执行的函数:

function trimObjectProperties(objectToTrim) {
    for (var key in objectToTrim) {
        if (objectToTrim[key].constructor && objectToTrim[key].constructor == Object)
            trimObjectProperties(objectToTrim[key]);
        else if (objectToTrim[key].trim)
            objectToTrim[key] = objectToTrim[key].trim();
    }
}

// Using this function, you should call it in that way:
trimObjectProperties(taskDataObject);
Run Code Online (Sandbox Code Playgroud)