JavaScript数组对象按条件将布尔值从false转true的问题求助
问题分析与解决方案
你的核心问题是修改布尔值时索引不匹配——trueVal里的j是筛选后数组的索引,但你用它去访问原数组words,导致修改的是错误的对象。另外你的代码存在不少冗余操作,比如单独提取names数组,完全可以简化实现。
简化实现思路
因为对象是引用类型,筛选出来的sixLetterWords里的元素和原数组words里的对象是同一个引用,所以在筛选的同时直接修改布尔值,或者遍历筛选后的数组修改都可以,不用绕弯子。
优化后的代码
const words = [ {name:"Lion", sixOrMore: false}, {name: "Jaguar", sixOrMore: false}, {name: "Cheetah", sixOrMore: false}, {name: "Tiger", sixOrMore: false}, {name: "Leopard", sixOrMore: false}, {name: "Bobcat", sixOrMore: false}, {name: "Puma", sixOrMore: false}, {name: "Ocelot", sixOrMore: false}, {name: "Lynx", sixOrMore: false}, {name: "Caracal", sixOrMore: false}, ]; // 一步完成筛选+修改布尔值 const sixLetterWords = words.filter(item => { if (item.name.length >= 6) { item.sixOrMore = true; // 直接修改原对象的布尔值 return true; } return false; }); console.log(JSON.stringify(sixLetterWords)); console.log(JSON.stringify(words));
原代码的具体问题拆解
- 索引不匹配:
trueVal里的j对应sixLetterNames的索引,但words[j]指向的是原数组的第j个元素,和你要修改的筛选后对象完全不对应。比如sixLetterWords第一个元素是Jaguar(原数组索引1),但j=0时你修改的是words[0](Lion),自然看不到效果。 - 冗余操作:单独提取
names数组完全没必要,直接遍历words数组访问item.name就行。 - 函数参数未利用:
myFilterFunction和trueVal都声明了接收参数,但内部根本没用到,属于无效代码。
另一种分步实现(如果一定要分开筛选和修改)
如果你想把筛选和修改分成两个步骤,也可以这样写:
// 第一步:筛选符合条件的对象 const sixLetterWords = words.filter(item => item.name.length >= 6); // 第二步:遍历筛选后的数组修改布尔值 const updateBoolean = (arr) => { arr.forEach(item => { item.sixOrMore = true; }); }; updateBoolean(sixLetterWords); console.log(JSON.stringify(sixLetterWords)); console.log(JSON.stringify(words));
这样既完成了筛选,又正确修改了对应对象的布尔值,而且代码简洁易读。
内容的提问来源于stack exchange,提问作者Laura
相关产品推荐
相关产品推荐

