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

如何检查字符串到对象数组的Map中是否存在对象内指定值,实现不存在则添加书籍并解决访问索引('Horror')的问题?

嘿,我来帮你搞定这个问题!首先得揪出你代码里的一个小语法错误——你现在写的bookMap写法不对哦:如果是普通对象,键值对得用冒号:而不是=>;如果是想用ES6的Map,那整个定义方式都不一样。我分两种常用的情况给你拆解:

情况1:使用普通对象(Object)

这是最常见的写法,先给你纠正后的bookMap定义:

const bookMap = {
  'Horror': [{ id: 9798721052927, title: 'Dracula', author: 'Bram Stoker' }],
  'Romance': [{ id: 9798721052927, title: 'Love Story', author: 'Bram Stoker' }]
};

检查是否包含指定书籍

要检查某个分类下是否存在目标书籍,用some方法比filter更高效(some找到匹配项就会停止遍历,而filter会返回所有匹配的数组),再搭配可选链?.避免分类不存在时报错:

const targetGenre = 'Horror';
const targetTitle = 'Dracula';

// 检查Horror分类里是否有标题为Dracula的书
const hasTargetBook = bookMap[targetGenre]?.some(book => book.title === targetTitle);
console.log(hasTargetBook); // 输出true

实现「不存在则添加」的功能

还要考虑如果分类本身不存在的情况,先初始化空数组,再用书籍id判断是否重复(用id比title更准确,毕竟可能有同名书):

function addBookIfNotExists(bookMap, genre, newBook) {
  // 如果分类不存在,先创建空数组
  if (!bookMap[genre]) {
    bookMap[genre] = [];
  }
  // 检查书籍是否已存在
  const bookExists = bookMap[genre].some(book => book.id === newBook.id);
  if (!bookExists) {
    bookMap[genre].push(newBook);
    console.log(`已添加书籍《${newBook.title}》到${genre}分类`);
  } else {
    console.log(`《${newBook.title}》已经在${genre}分类里啦`);
  }
}

// 示例调用:添加一本新的恐怖小说
addBookIfNotExists(bookMap, 'Horror', { id: 123456, title: 'Frankenstein', author: 'Mary Shelley' });
情况2:使用ES6 Map

如果你确实想使用Map(它的键可以是任意类型,比对象更灵活),那正确的定义是这样的:

const bookMap = new Map([
  ['Horror', [{ id: 9798721052927, title: 'Dracula', author: 'Bram Stoker' }]],
  ['Romance', [{ id: 9798721052927, title: 'Love Story', author: 'Bram Stoker' }]]
]);

检查是否包含指定书籍

Map用get()方法获取对应键的值,同样用some判断:

const targetGenre = 'Horror';
const targetTitle = 'Dracula';

const genreBooks = bookMap.get(targetGenre);
const hasTargetBook = genreBooks ? genreBooks.some(book => book.title === targetTitle) : false;
console.log(hasTargetBook); // 输出true

实现「不存在则添加」的功能

Map用set()方法设置键值对,逻辑和对象版本类似:

function addBookIfNotExists(bookMap, genre, newBook) {
  let genreBooks = bookMap.get(genre);
  // 如果分类不存在,初始化空数组并设置到Map中
  if (!genreBooks) {
    genreBooks = [];
    bookMap.set(genre, genreBooks);
  }
  // 用id判断书籍是否已存在
  const bookExists = genreBooks.some(book => book.id === newBook.id);
  if (!bookExists) {
    genreBooks.push(newBook);
    console.log(`已添加书籍《${newBook.title}》到${genre}分类`);
  } else {
    console.log(`《${newBook.title}》已经在${genre}分类里啦`);
  }
}

// 示例调用:添加一本科幻小说
addBookIfNotExists(bookMap, 'Sci-Fi', { id: 789012, title: 'Dune', author: 'Frank Herbert' });

关于你之前的报错

你写的bookMap.get('Horror')如果是普通对象的话会报错,因为普通对象没有get()方法,得用bookMap['Horror']或者bookMap.Horror;如果是想用Map,那之前的bookMap定义语法错误,得改成new Map()的形式才行。

内容的提问来源于stack exchange,提问作者Reality is a Fractal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 22:52:46