扩展通用与网站专属设置存储方案及查询方法咨询
问题解答
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
相关产品推荐
相关产品推荐

