JavaScript如何根据指定name值移除JSON数组中的对应对象
按name字段删除JSON数组指定对象
完全可以仅通过name字段匹配完成对应对象的删除操作。
推荐实现(filter 方案,无副作用)
Array.filter是最适配这个场景的方法,不会修改原数组,逻辑简洁:
let json = [{ "name":"John", "age":"29" }, { "name":"Billy", "age":"45" }]; let remObj = ['John']; // 过滤掉name存在于待删除列表中的项 const result = json.filter(item => !remObj.includes(item.name)); // result 值为 [{name: "Billy", age: "45"}]
注意:filter不会修改原数组,必须用变量接收它的返回值才能得到过滤后的结果,这是很多人用filter没达到预期的最常见原因。
其他方法实现&常见失效原因
你之前提到的几个方法没生效,基本都是用法问题:
splice:会直接修改原数组,如果正序遍历数组同时调用splice删除元素,会导致数组索引整体前移,出现漏删。如果要用splice实现,必须倒序遍历:for (let i = json.length - 1; i >= 0; i--) { if (remObj.includes(json[i].name)) { json.splice(i, 1); } }slice:本身的作用是截取数组片段返回新数组,不会对原数组做删除操作,本身就不适合做批量匹配删除的场景。
性能优化提示
如果待删除的name列表数据量超过1000条,可以先把待删除列表转成Set结构,把查询复杂度从O(n)降到O(1),提升过滤速度:
const remNameSet = new Set(remObj); const result = json.filter(item => !remNameSet.has(item.name));
内容的提问来源于stack exchange,提问作者Liron Krouchinin
相关产品推荐
相关产品推荐

