JavaScript 如何删除数组内嵌套对象中的指定属性
问题分析
你之前的代码存在两个核心问题:
map遍历没有返回值,执行后得到的会是全空数组- 不需要遍历
Object.values(book),匹配到对应语言后直接操作该元素下的books对象即可
实现代码
以下实现为无副作用写法,不会修改原始数组数据,所有修改都在新生成的对象上完成:
// 基础数据 let books = [ { language: 'spanish', books: { book_1: 'book1_spanish', book_2: 'book2_spanish', book_3: 'book3_spanish' } }, { language: 'italian', books: { book_1: 'book1_italian', book_2: 'book2_italian', book_3: 'book3_italian' } } ]; // 功能实现函数 function removeTargetBook(lan, target, originalBooks) { // 提取要删除的目标书籍的键名 const targetKey = Object.keys(target)[0]; // 提取要匹配的目标书籍的值,可用于严格校验避免误删 const targetValue = target[targetKey]; return originalBooks.map(item => { // 语言不匹配直接返回浅拷贝对象,避免修改原数据 if (item.language !== lan) { return {...item}; } // 过滤掉匹配的键值对,生成新的books对象 const filteredBooks = Object.fromEntries( Object.entries(item.books).filter(([key, value]) => { // 键和值同时匹配才会被过滤删除,不需要严格匹配值的话可以去掉&&后面的判断 return !(key === targetKey && value === targetValue); }) ); // 返回拼接后的新对象 return { ...item, books: filteredBooks }; }); } // 调用示例 let targetBook = { book_1: 'book1_spanish' }; let language = 'spanish'; const processedBooks = removeTargetBook(language, targetBook, books); console.log(processedBooks);
输出结果
执行后processedBooks就是你需要的结果,spanish分类下的books已删除book_1: 'book1_spanish'键值对,italian分类数据完全保留,原始books数组不会被修改。
内容的提问来源于stack exchange,提问作者zana10
相关产品推荐
相关产品推荐

