【发布时间】:2015-12-24 12:06:25
【问题描述】:
我正在尝试使用对象键访问另一个对象中的一个对象。我正在连接一组 <select> 元素的值以构建与键匹配的字符串。不幸的是,这永远行不通。下面是代码:
var valueKeyString = "";
$(".keySelector").each(function(){
valueKeyString += $(this).val();
});
if (geoAttrs[selectedGeoAttr].rowCol == "row") {
mapData = rowValueGroups[valueKeyString];
} else if (geoAttrs[selectedGeoAttr].rowCol == "col") {
mapData = colValueGroups[valueKeyString];
}
在尝试了很多东西之后,我使用charCodeAt()逐个字符地测试了字符串:
var test1 = valueKeyString;
for (var i = 0, len = valueKeyString.length; i < len; i++) {
test1 += valueKeyString.charCodeAt(i)+" ";
}
if (geoAttrs[selectedGeoAttr].rowCol == "row") {
Object.keys(colValueGroups).forEach(function(group) {
var test2 = group;
for (var i = 0, len = group.length; i < len; i++) {
test2 += group.charCodeAt(i)+" ";
}
console.log(test1);
console.log(test2)
})
mapData = colValueGroups[valueKeyString];
}
我的连接字符串在连接点都有一个额外的字符,charCode 为 0。无法弄清楚它为什么存在或如何使用正则表达式或str.replace() 摆脱它。最后得到了一个丑陋但实用的解决方案,我只是测试对象键以查看它们是否包含来自 <select> 元素的值:
var valueKeys = [];
$(".keySelector").each(function(){
valueKeys.push($(this).val());
});
if (geoAttrs[selectedGeoAttr].rowCol == "row") {
Object.keys(colValueGroups).forEach(function(group) {
var groupHasAllKeys = true;
valueKeys.forEach(function(key) {
if (group.indexOf(key) == -1 ) {
groupHasAllKeys = false;
}
});
if(groupHasAllKeys) {
mapData = colValueGroups[group];
}
});
} else if (geoAttrs[selectedGeoAttr].rowCol == "col") {
Object.keys(rowValueGroups).forEach(function(group) {
var groupHasAllKeys = true;
valueKeys.forEach(function(key) {
if (group.indexOf(key) == -1 ) {
groupHasAllKeys = false;
}
});
if(groupHasAllKeys) {
mapData = rowValueGroups[group];
}
});
}
一定有更好的方法,对吧?这到底是怎么回事?
编辑:rowValueGroups 可能看起来像这样:
{
"35_to_44_yearsMale": {
"4654387684": {
"value": 215
},
"4654387685": {
"value": 175
},
"4654387686": {
"value": 687
},
"4654387687": {
"value": 172
}
},
"45_to_54_yearsMale": {
"4654387684": {
"value": 516
},
"4654387685": {
"value": 223
},
"4654387686": {
"value": 54
},
"4654387687": {
"value": 164
}
}
}
valueKeyString 应该是 "45_to_54_yearsMale" 或类似的。
这是调查数据。我正在从 nicolaskruchten/pivottable 自定义渲染器的输出中提取 rowValueGroups 数据。 (如果你好奇的话,特别是来自pivotData.tree 对象)。我不想改变可枢转核心来改变这些键的格式,所以我只是想我会从一个选择元素中连接几个值以使其工作。
以下是上述测试的部分控制台输出:
35_to_44_yearsMale51 53 95 116 111 95 52 52 95 121 101 97 114 115 0 77 97 108 101
35_to_44_yearsMale51 53 95 116 111 95 52 52 95 121 101 97 114 115 77 97 108 101
第一行是对 valueKeyString 进行的测试,第二行是对来自rowValueGroups 的一个键进行的测试。请注意,初始字符串看起来相同,(Firefox 控制台实际上在“years”和“Male”之间为valueKeyString 输出了一个未找到的小方块)但charCodeAt() 出现了那个奇怪的 0 字符连接点。
【问题讨论】:
-
值的示例对
valueKeyString和rowValueGroups会有所帮助。会让您更容易了解您想要实现的目标 -
在编辑中添加了详细信息。
-
如果您只是在每个之后清理字符串怎么办?喜欢
valueKeyString = valueKeyString.replace(/[^a-z0-9_-]+/gi,'') -
试一试。它并没有清除那个奇怪的角色。似乎正则表达式等实际上并没有将其识别为字符,因此他们无法摆脱它。尽管如此,这似乎足以阻止字符串匹配。
-
你能给我们一个关于 jsfiddle 的可重现演示吗?我对 keySelector 元素的 html 特别感兴趣。
标签: javascript regex string object concatenation