You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 18:24:04