设置:
我有一个嵌套的 html 表结构,它显示分层数据,并且用户可以隐藏或显示各个行。每行都有一个 dom id,它由级别号加上该级别上记录类型的主键组成。我必须两者都有,因为每个级别都来自不同的数据库表,所以单独的主键在 dom 中不是唯一的。
example: id="level-1-row-216"
我将可见元素的级别和行存储在 cookie 中,以便在页面重新加载时可以自动显示用户打开的相同行。我不存储 dom id 的完整映射,因为我担心它会变得过于冗长,并且我希望将我的 cookie 保持在 4Kb 以下。
所以我将 dom id 转换为像这样的紧凑 json 对象,每个级别都有一个属性,每个级别下都有一个唯一的主键数组:
{
1:[231,432,7656],
2:[234,121],
3:[234,2],
4:[222,423],
5:[222]
}
将此结构存储在 cookie 中,我将其提供给我的 show 函数,并在页面加载时恢复用户之前的公开状态。
需要改进的地方:
我正在寻找更好的选择来减少我的 id 选择器映射到这种紧凑的格式。这是我的功能:
function getVisibleIds(){
// example dom id: level-1-row-216-sub
var ids = $("tr#[id^=level]:visible").map(function() {
return this.id;
});
var levels = {};
for(var i in ids ) {
var id = ids[i];
if (typeof id == 'string'){
if (id.match(/^level/)){
// here we extract the number for level and row
var level = id.replace(/.*(level-)(\d*)(.*)/, '$2');
var row = id.replace(/.*(row-)(\d*)(.*)/, '$2');
// *** Improvement here? ***
// This works, but it seems klugy. In PHP it's one line (see below):
if(levels.hasOwnProperty(level)){
if($.inArray(parseInt(row, 10) ,levels[level]) == -1){
levels[level].push(parseInt(row, 10));
}
} else {
levels[level] = [parseInt(row, 10)];
}
}
}
}
return levels;
}
如果我在 PHP 中执行此操作,我会像这样构建紧凑数组,但我无法在 javascript 中弄清楚:
foreach($ids as $id) {
if (/* the criteria */){
$level = /* extract it from $id */;
$row = /* extract it from $id */;
$levels[$level][$row];
}
}