使用jQuery为对象批量赋值失败,求解决方案
问题分析与解决方案
核心问题
你当前的代码存在两个关键问题:
- 每次循环通过
Object.assign给obj赋值时,都会覆盖掉之前的name和email属性,最终obj只会保留最后一行表格的数据 - 没有排除底部包含输入框的
<tr>,这一行的文本内容为空,会污染最终结果
解决方案
根据需求,有两种常见的实现方式:
方式1:将所有用户数据存储为对象数组(推荐)
如果需要保留所有行的用户信息,用数组存储每个用户的对象是更合理的选择:
$(document).ready(function () { console.log("rendered."); var trs = $("#myTable").find("tbody>tr"); // 用数组存储多个用户对象 var userList = []; $(trs).each(function (index, content) { var $tr = $(content); // 跳过包含输入框的行 if ($tr.hasClass("insert_td_after_it")) return; var name = $tr.find("td:eq(0)").text().trim(); var email = $tr.find("td:eq(1)").text().trim(); // 仅添加有有效内容的条目 if (name && email) { userList.push({ name: name, email: email }); } }); console.log(userList); // 输出结果:[{name: "John", email: "john@example.com"}, {name: "Smith", email: "smith@example.com"}] });
方式2:将名字作为键,邮箱作为值存储到对象中
如果需要快速通过名字查找对应的邮箱,可以用键值对形式存储:
$(document).ready(function () { console.log("rendered."); var trs = $("#myTable").find("tbody>tr"); var userMap = {}; $(trs).each(function (index, content) { var $tr = $(content); if ($tr.hasClass("insert_td_after_it")) return; var name = $tr.find("td:eq(0)").text().trim(); var email = $tr.find("td:eq(1)").text().trim(); if (name && email) { // 用名字作为对象键,邮箱作为对应值 userMap[name] = email; } }); console.log(userMap); // 输出结果:{John: "john@example.com", Smith: "smith@example.com"} });
关键改进点
- 使用数组存储多组数据,避免属性被重复覆盖
- 通过
hasClass过滤掉带输入框的行,避免引入空值 - 用
trim()去除文本前后的空白字符,保证数据整洁 - 增加非空判断,确保只存入有效数据
内容的提问来源于stack exchange,提问作者Liakat Hossain
相关产品推荐
相关产品推荐

