
本文介绍如何从对象数组中提取指定字符串属性(如 description),使用 slice() 截取子串,并返回仅含该处理后属性的新对象数组,全程不修改原始数据,适合初学者掌握函数式编程思维。
本文介绍如何从对象数组中提取指定字符串属性(如 description),使用 slice() 截取子串,并返回仅含该处理后属性的新对象数组,全程不修改原始数据,适合初学者掌握函数式编程思维。
在 JavaScript 中,字符串是不可变类型,slice() 方法不会修改原字符串,而是返回一个新字符串。因此,若想将截取后的结果保存到对象属性中,必须显式赋值(如 obj.prop = obj.prop.slice(3))。但更推荐的做法是——避免直接修改原始数据,转而使用函数式方法(如 .map())创建全新数组,既安全又符合现代开发实践。
以下是以你提供的 cars 数据为例的完整解决方案:
✅ 推荐方案:使用 map() 创建纯净新数组(不修改原数据)
const cars = [
{ "status": "disabled" },
{
"status": "active",
"store": true,
"models": [
{ "description": "4 doors, 0km/h, no breakdowns", "color": "black", "price": 100000 },
{ "description": "2 doors, 30.000km/h, some breakdowns", "color": "black", "price": 20000 },
{ "description": "4 doors, 120.000km/h, no breakdowns", "color": "red", "price": 50000 }
]
}
];
// 安全提取 models 数组(解构 + 可选链防错)
const models = cars[1]?.models || [];
// 使用 map 生成新数组:每个对象只保留截取后的 description
const result = models.map(model => ({
description: model.description?.slice(3) || ''
}));
console.log(result);
// 输出:
// [
// { description: "doors, 0km/h, no breakdowns" },
// { description: "doors, 30.000km/h, some breakdowns" },
// { description: "doors, 120.000km/h, no breakdowns" }
// ]
⚠️ 注意事项与最佳实践
-
不要依赖
delete+ 原地修改:你原先用delete carsTwo[i].color修改原数组,这会污染cars数据源,后续逻辑可能出错; -
避免多个循环:合并操作(如删除字段 + 截取字符串)到单个
.map()中,性能更好、代码更简洁; -
增强健壮性:使用可选链(
?.)和空值合并(|| '')防止description不存在时抛错; -
语义清晰优先:
.map()明确表达了“转换每一项”的意图,比for循环更易读、更少出错。
? 扩展:如需截取不同长度或动态逻辑?
// 示例:截去前 3 字符,再取前 20 个字符(防超长)
const resultTruncated = models.map(model => ({
description: (model.description?.slice(3) || '').substring(0, 20)
}));
总结:面向初学者,应优先掌握 map() + 解构 + 不可变更新这一组合范式——它让代码更可靠、更易测试,也为你后续学习 React、Redux 等框架打下坚实基础。










