Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在设置JavaScript对象中的所有属性时,有效地修剪()空格字符吗?_Javascript_Jquery_Trim - Fatal编程技术网

在设置JavaScript对象中的所有属性时,有效地修剪()空格字符吗?

在设置JavaScript对象中的所有属性时,有效地修剪()空格字符吗?,javascript,jquery,trim,Javascript,Jquery,Trim,这是一个精简的演示,包含了复制我需要做的事情所需的非常基本的功能 在我的JavaScript应用程序中,我在项目任务记录上有一个点击事件 当单击一个任务时,我用来自DOM的数据填充一个JavaScript对象,这些数据与单击的任务记录相关 我的问题是,当我从DOM打印保存到对象的值时,字符串前后总是有大量空格字符 我有这个垫片来利用较新的内置JavaScripttrim()函数 /* JavaScript trim() method is ES 5, just in case polyfill

这是一个精简的演示,包含了复制我需要做的事情所需的非常基本的功能

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

当单击一个任务时,我用来自DOM的数据填充一个JavaScript对象,这些数据与单击的任务记录相关

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

我有这个垫片来利用较新的内置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, '');
  };
}
下面我有一个关于这个问题的简单演示

您将看到存储在
taskDataObject

(注意:我意识到下面的实际选择器代码很恶心,即 我的待办事项清单上的下一项!)

此JSFIDLE页面包含显示我的演示正在运行的所有代码:

单击
.taskName
时,它从DOM中获取数据并将其保存到
taskDataObject
JavaScript对象

我正在寻找一种好方法,将此
str.trim()
code应用于
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);

      }
    }

});

如果我正确理解您的问题,您只需要调用
text().trim()
而不是
text()
text()
返回一个
字符串

如果确实需要对每个特性值进行修剪,请执行以下操作:

for (var key in taskDataObject) {
    if(taskDataObject[key].trim)
       taskDataObject[key] = taskDataObject[key].trim(); 
}
这里有一个函数可以递归地执行此操作,以及所有子属性:

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);

我认为你对你的问题有足够的评论和答案,但既然你说你正在学习js,我想我会给讨论带来另一个视角

首先,我想提醒您,jQuery已经有了一个,所以您不需要另一个垫片,因为您正在使用jQuery

jQuery的另一个重要方面是它的扩展有多容易。因此,您可以添加自己的方法:

$.fn.extend({
  trimmedText: function() {
    return $.trim($(this).text());
  }
});
然后在代码中的任何位置使用它:

$(element).trimmedText();

.next().next().next().next().next()
?为什么不在
.text().trim()
之后对每个元素进行修剪?@elclanrs我猜他是在尝试使代码可伸缩,以防他向对象添加50个字段。他必须手动
.text().trim()
它们,这一点都不好玩。或者,如果这些不是用户输入的字符串,那么当它们进入
td
时,为什么不
trim()
它们呢?然后您就可以保证
字符串
会被修剪。也许应该动态生成
任务数据对象
,而不是修复。我会先重构那些
下一个
调用,然后OP可能会找到一个模式进行抽象,然后只调用
trim
一次。@elclars我知道!我甚至在我的帖子里放了一个免责声明,因为我知道这很可怕,这是我在很匆忙的时候做的事情,我对JavaScript不太了解,所以基本上这是第一件有效的事情。我非常想重构所有这些
next()
!至于动态生成
taskDataObject
我喜欢它的声音,只是不知道如何实现这一切……JavaScript对我来说是一个正在学习的过程,因为直到最近我一直都是后端。尽管我很喜欢JavaScript,所以我沉浸在所有的评论中,感谢他,这可能会解决他的真正需求,正如他所说的“当它们被设置好的时候?”。在我看来,他试图修剪每一个属性值,因为不知道在设置的时候可以这样做。但你是对的。我用代码编辑了我的答案,完成了要求的操作。谢谢,我很好奇这行末尾的
修剪
做了什么
if(taskDataObject[key].trim)
@JasonDavis我正在检查属性值上是否存在此“方法”。假设taskId是一个数字,如果调用taskId.trim(),您将得到一个错误,因为.trim只针对StringsHanks存在!我几乎忽视了这一部分,但似乎我不应该!您认为应该进行某种类型的检查以确保属性是字符串类型,还是现在基本上是这样做的?谢天谢地,这看起来也很不错,但重构得有点深