在设置JavaScript对象中的所有属性时,有效地修剪()空格字符吗?
这是一个精简的演示,包含了复制我需要做的事情所需的非常基本的功能 在我的JavaScript应用程序中,我在项目任务记录上有一个点击事件 当单击一个任务时,我用来自DOM的数据填充一个JavaScript对象,这些数据与单击的任务记录相关 我的问题是,当我从DOM打印保存到对象的值时,字符串前后总是有大量空格字符 我有这个垫片来利用较新的内置JavaScript在设置JavaScript对象中的所有属性时,有效地修剪()空格字符吗?,javascript,jquery,trim,Javascript,Jquery,Trim,这是一个精简的演示,包含了复制我需要做的事情所需的非常基本的功能 在我的JavaScript应用程序中,我在项目任务记录上有一个点击事件 当单击一个任务时,我用来自DOM的数据填充一个JavaScript对象,这些数据与单击的任务记录相关 我的问题是,当我从DOM打印保存到对象的值时,字符串前后总是有大量空格字符 我有这个垫片来利用较新的内置JavaScripttrim()函数 /* JavaScript trim() method is ES 5, just in case polyfill
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存在!我几乎忽视了这一部分,但似乎我不应该!您认为应该进行某种类型的检查以确保属性是字符串类型,还是现在基本上是这样做的?谢天谢地,这看起来也很不错,但重构得有点深