如何从对象数组提取去重州名数组?原代码返回字符数组问题
解决方案
你的代码问题出在错误地对单个州名字符串使用了Set。字符串是可迭代对象,当你把单个州名(比如"Ohio")传入new Set()时,它会把字符串拆成单个字符(['O','h','i','o']),这就是为什么你得到的是字符数组,而且完全没实现全局去重——你是在循环里每次只处理一个州就去重,根本没收集所有州名再统一处理。
修改思路:
- 先遍历所有客户对象,把所有州名收集到一个数组里
- 再对这个完整的州名数组使用
Set去重,最后转回数组
修改后的代码(基于原循环改造):
const arrayOfCustomerObjects = [{ "profile": { "name": { "first": "Lucille", "last": "Bradshaw" }, "address": { "line1": "91 Juliana Place", "line2": "Apt 226", "city": "Homeworth", "state": "Ohio" } } }, { "profile": { "name": { "first": "John", "last": "Doe" }, "address": { "line1": "123 Main St", "city": "Columbus", "state": "Ohio" } } }]; function getUniqueListOfAllCustomerStates(data) { let stateArray = []; // 第一步:收集所有州名 for (let i = 0; i < data.length; i++) { // 可选:加个判断避免找不到属性报错 if (data[i]?.profile?.address?.state) { stateArray.push(data[i].profile.address.state); } } // 第二步:对所有州名去重 return [...new Set(stateArray)]; } console.log(getUniqueListOfAllCustomerStates(arrayOfCustomerObjects)); // 输出 ["Ohio"]
更简洁的写法(使用数组方法):
如果习惯函数式写法,可以用map提取州名,再用Set去重:
function getUniqueListOfAllCustomerStates(data) { const allStates = data .filter(customer => customer?.profile?.address?.state) // 过滤无效项 .map(customer => customer.profile.address.state); return [...new Set(allStates)]; }
内容的提问来源于stack exchange,提问作者alex
相关产品推荐
相关产品推荐

