如何反转JavaScript对象数组中的布尔值并提取反转后为True的键?
问题分析与解决
你的代码没生效主要有三个原因:
- 修改的是局部变量而非原对象属性:在
forEach的解构逻辑中,value是布尔值的副本,修改它不会影响原对象里的属性,必须直接操作obj[key]才能修改原数据。 - 只处理了
false转true,没完成反转:反转需要把true改成false、false改成true,你只处理了前者。 - 缺少提取反转后为
true的键的逻辑:原代码完全没做这部分处理。
下面是两种解决方案,按需选择:
方案1:不修改原数组,生成新结果(推荐)
这种方式保留原数据,返回包含反转后属性和目标键的新数组:
const processedData = data.map(item => { const reversedObj = { rdd: item.rdd }; const trueKeys = []; Object.entries(item).forEach(([key, value]) => { if (key === 'rdd') return; // 跳过非布尔类型的rdd字段 const reversedVal = !value; reversedObj[key] = reversedVal; if (reversedVal) trueKeys.push(key); }); return { ...reversedObj, trueKeysAfterReverse: trueKeys }; }); console.log(processedData);
方案2:直接修改原数组,同时收集目标键
如果需要直接修改原数据,可使用此方式:
const trueKeysCollection = []; data.forEach(item => { const keys = []; for (const key in item) { if (key === 'rdd') continue; // 反转布尔值并更新原对象 item[key] = !item[key]; // 收集反转后为true的键 if (item[key]) keys.push(key); } trueKeysCollection.push({ rdd: item.rdd, trueKeys: keys }); }); console.log('修改后的原数组:', data); console.log('每个对象反转后为true的键:', trueKeysCollection);
原代码修正版
如果只是想修正你原来的代码,让它能完成布尔值反转:
console.log('原数组:', data); data.forEach(obj => { Object.entries(obj).forEach(([key, value]) => { if (key !== 'rdd') { // 直接修改原对象的属性,完成反转 obj[key] = !value; } }); }); console.log('反转后的数组:', data);
内容的提问来源于stack exchange,提问作者Abhinav
相关产品推荐
相关产品推荐

