如何遍历包含对象的数组?需适配现有简单数组功能代码
处理包含对象的数组实现点击判断功能
首先看你原来的代码是用单个数组来判断点击的td是否属于目标ID,现在换成了包含多个locations数组的对象数组,其实只需要稍微调整一下逻辑就能实现同样的功能,甚至可以更灵活。
先给你修改后的完整代码,然后再解释关键点:
// 注意:这里把01改成1,避免JS把前缀0的数字当成八进制解析产生问题 let boxes = [ { locations: [1, 2, 3]}, { locations: [23, 24, 25]}, { locations: [41, 42, 43]} ]; function hitMiss(boxes) { // 把所有对象里的locations数组合并成一个大数组,方便后续判断 const allTargetIds = boxes.flatMap(item => item.locations); $("td").on("click", function(){ const clickedId = parseInt($(this).attr("id"), 10); if (allTargetIds.includes(clickedId)) { $(this).addClass("yes"); console.log("full"); } else { $(this).addClass("no"); console.log("empty"); } }); }; // 记得调用函数 hitMiss(boxes);
几个关键调整点:
- 合并目标ID数组:用
flatMap方法遍历boxes里的每个对象,把每个对象的locations数组提取出来并合并成一个大数组,这样就和你原来的box1结构一致了,判断逻辑也能沿用类似的思路。 - 类型统一:
$(this).attr("id")返回的是字符串类型,而你数组里存的是数字,所以用parseInt把它转成十进制数字,再用includes做存在性检查,比原来的find更简洁高效。 - 避免八进制陷阱:原来的
01、02这种写法在JS里会被解析成八进制数,比如010会变成十进制的8,容易出现预期外的错误,所以直接写十进制数字更稳妥。
如果之后你需要针对不同的locations数组做不同的处理(比如不同的样式或日志),也可以在点击事件里遍历boxes对象,判断当前点击的ID属于哪个对象的locations,比如:
$("td").on("click", function(){ const clickedId = parseInt($(this).attr("id"), 10); // 找到包含当前ID的对象 const matchedBox = boxes.find(item => item.locations.includes(clickedId)); if (matchedBox) { $(this).addClass("yes"); console.log(`full,属于目标组: ${JSON.stringify(matchedBox.locations)}`); } else { $(this).addClass("no"); console.log("empty"); } });
这样就能更灵活地处理每个对象的情况啦。
内容的提问来源于stack exchange,提问作者saint
相关产品推荐
相关产品推荐

