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

扩展通用与网站专属设置存储方案及查询方法咨询

问题解答

1. 当前结构是否为最优方案?

不是。你当前的websitesettings数组设计存在明显冗余:每个数组元素都是仅包含单个网站编号键的对象,既浪费存储空间,后续通过编号查找设置时还需要遍历数组,效率偏低。

更优的结构是把websitesettings也设计为键为网站编号、值为对应设置对象的普通对象,和websites的结构对齐,这样编号和设置的映射关系更直观,读写操作都是O(1)的时间复杂度,比数组高效得多。优化后的结构示例:

const extensionsettings = {
  websites: {
    1: 'website 1',
    2: 'website 2',
    3: 'website 3'
  },
  websitesettings: {
    1: { color: 'green', size: '12' },
    2: { color: 'red', size: '10' },
    3: { color: 'blue', size: '20' }
  },
  general: {
    optionalsetting1: 'yes',
    optionalsetting2: 'no'
  }
};

2. 如何检查网站是否已保存并返回其设置?

基于优化后的结构

直接通过对象的键存在性判断即可,操作非常简洁:

function getWebsiteSettings(websiteId) {
  // 先检查网站是否在已保存列表中
  if (extensionsettings.websites.hasOwnProperty(websiteId)) {
    // 返回对应设置,若没有设置可返回默认值或null
    return extensionsettings.websitesettings[websiteId] || null;
  }
  // 网站未保存时返回提示或null
  return null;
}

// 调用示例
console.log(getWebsiteSettings(2)); // { color: 'red', size: '10' }
console.log(getWebsiteSettings(4)); // null

基于你原有的结构

需要遍历websitesettings数组查找对应编号的设置:

function getWebsiteSettingsOld(websiteId) {
  // 先检查网站名称是否存在
  if (!extensionsettings.websites[websiteId]) {
    return '网站未保存';
  }
  // 在数组中查找对应设置
  const settingItem = extensionsettings.websitesettings.find(item => item.hasOwnProperty(websiteId));
  return settingItem ? settingItem[websiteId] : null;
}

3. 应使用indexOf还是findIndex?

必须用findIndex,原因如下:

  • indexOf是查找数组中**严格相等(===)**的元素,而你的websitesettings数组元素是对象,两个对象即使内容相同也不会严格相等,所以indexOf无法定位到目标元素。
  • findIndex支持传入自定义判断的回调函数,可以检查每个数组元素是否包含目标网站编号的键,完美适配你原结构的查找需求。

示例(基于原结构):

const targetIndex = extensionsettings.websitesettings.findIndex(item => item.hasOwnProperty(2));
console.log(targetIndex); // 1(对应数组中第二个元素)

内容的提问来源于stack exchange,提问作者Markus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 16:50:23