JavaScript:遍历含字符串与函数的对象仅提取字符串值数组的问题
解决方法:正确识别对象中的字符串值并排除函数
嘿,我明白你的问题了——你想从一个混合了字符串和函数的对象里提取出所有字符串值,但你的if条件一直没触发,对吧?问题出在你判断元素类型的方式上!
为什么你的代码不生效?
你写的判断条件 arrayObject[i] === String 是在把数组里的元素和String构造函数本身做严格相等比较,而不是判断这个元素是不是字符串类型。举个例子,一个字符串 "hello" 和 String 构造函数完全是两个不同的东西,所以这个条件永远不会成立,自然不会把字符串推进结果数组里。
修复你的for循环代码
我们需要用 typeof 运算符来判断元素的类型(针对原始字符串),如果还要考虑很少用到的String对象(比如new String("test")),可以再加上instanceof的判断。修改后的代码如下:
// 先把对象转成值数组 const arrayObject = Object.values(yourInputObject); // 这里替换成你的实际对象变量名 let objectInput = []; for (let i = 0; i < arrayObject.length; i++) { const currentItem = arrayObject[i]; // 判断是否是原始字符串 或者 String对象 if (typeof currentItem === 'string' || currentItem instanceof String) { objectInput.push(currentItem); } } return objectInput;
更简洁的写法:用数组filter方法
如果你想让代码更简洁易读,可以直接用数组的filter方法,一行就能完成筛选:
const stringValues = Object.values(yourInputObject).filter(item => { // 同样的判断逻辑 return typeof item === 'string' || item instanceof String; }); return stringValues;
补充说明
- 如果你平时只用原始字符串(就是用单引号/双引号/反引号创建的字符串,比如
"foo"),那只需要typeof item === 'string'这一个判断就足够了。 instanceof String是用来判断那些通过new String()创建的字符串对象的,这种写法在实际开发中很少用到,你可以根据自己的场景选择是否保留。
内容的提问来源于stack exchange,提问作者s73c
相关产品推荐
相关产品推荐

