我有一个包含windows os版本的字典,例如:
{
"64-bit Microsoft Windows NT 6.2.9200": 1,
"32-bit Microsoft Windows NT 6.2.9137": 2,
"64-bit Microsoft Windows NT 6.1.3700": 3,
"64-bit Microsoft Windows NT 6.1.1200": 4
}我有一张映射windows NT 6.*到windows 7或windows 8的地图,例如:
Microsoft Windows NT 6.1.*->windows 7
Microsoft Windows NT 6.2.*->windows 8那么,我如何用格式将旧字典映射到新字典:
{
"64-bit Microsoft Windows 8": 1,
"32-bit Microsoft Windows 8": 2,
"64-bit Microsoft Windows 7": 7
}谢谢
发布于 2015-04-16 21:18:32
在键上使用for..in和String.prototype.replace,您可以将类似的东西放在一起
var old_dict = {
"64-bit Microsoft Windows NT 6.2.9200": 1,
"32-bit Microsoft Windows NT 6.2.9137": 2,
"64-bit Microsoft Windows NT 6.1.3700": 3,
"64-bit Microsoft Windows NT 6.1.1200": 4
};
var new_dict = (function (d1) {
var k1, k2, d2 = {},
re = /NT (\d+\.\d+)\.\d+/,
version_map = { // major.minor version number mappings
'6.1': '7',
'6.2': '8'
};
function replacer($0, $1) { // if we don't have a map, default to what was put in
return version_map[$1] || $0;
}
for (k1 in d1) {
k2 = k1.replace(re, replacer);
d2[k2] = (d2[k2] || 0) + d1[k1]; // add together if already exists
}
return d2;
}(old_dict));
/* new_dict looks like {
"64-bit Microsoft Windows 8": 1,
"32-bit Microsoft Windows 8": 2,
"64-bit Microsoft Windows 7": 7
} */发布于 2015-04-16 21:07:17
另一种选择是使用正则表达式来匹配目标,如下所示:
var maps = {
// result => RegExp
'64-bit Microsoft Windows 7': /64-bit.+?NT\s6\.1/,
'32-bit Microsoft Windows 8': /32-bit.+?NT\s6\.2/,
'64-bit Microsoft Windows 8': /64-bit.+?NT\s6\.2/
};
var test_data={
"64-bit Microsoft Windows NT 6.2.9200": 1,
"32-bit Microsoft Windows NT 6.2.9137": 2,
"64-bit Microsoft Windows NT 6.1.3700": 3,
"64-bit Microsoft Windows NT 6.1.1200": 4
};
var result={};
for(key in test_data){
for(target in maps){
if(maps[target].test(key)){
if(!result[target]){
result[target]=0;
}
result[target]+=test_data[key];
break;
}
}
}
console.dir(result);它将产生:
{ '64-bit Microsoft Windows 8': 1,
'32-bit Microsoft Windows 8': 2,
'64-bit Microsoft Windows 7': 7 }已更新
正则表达式可以更精确一些,通过将它们锚定到字符串的开头和结尾,从而暴露可能的外围情况,如下所示:
`/^64-bit.+?NT\s6\.1.+$/`可描述为:
^ # beginning of target string
64-bit # literal '64-bit'
.+? # one or more chars, non-greedy
NT # literal 'NT'
\s # literal space
6\.1 # literal '6.1'
.+ # one or more chars, greedy
$ # end of target string您还可以报告与目标模式不匹配的目标,方法是重构如下:
for(key in test_data){
var found=false;
for(target in maps){
if(maps[target].test(key)){
if(!result[target]){
result[target]=0;
}
result[target]+=test_data[key];
found=true;
break;
}
}
if(!found){
console.warn('encountered unknown record at key "%s"',key)
}
}发布于 2015-04-16 21:00:18
您可以遍历该对象,并根据需要对它们进行更改。
例如:
var myObj = {
"64-bit Microsoft Windows NT 6.2.9200": 1,
"32-bit Microsoft Windows NT 6.2.9137": 2,
"64-bit Microsoft Windows NT 6.1.3700": 3,
"64-bit Microsoft Windows NT 6.1.1200": 4
};
var myNewObj = {
"64-bit Microsoft Windows 7" : 0,
"64-bit Microsoft Windows 8" : 0
};
for (var key in myObj){
if (key.indexOf("Microsoft Windows NT 6.1") > -1){
myNewObj["64-bit Microsoft Windows 7"] += myObj[key];
} else if (key.indexOf("Microsoft Windows NT 6.2") > -1){
myNewObj["64-bit Microsoft Windows 8"] += myObj[key];
} else {
myNewObj[key] = myObj[key];
}
}像这样的东西应该能起作用,我还没有测试过它,但它似乎就在我的脑海中:)
这里有一个JS,它应该工作正常:https://jsfiddle.net/n3wp70me/
https://stackoverflow.com/questions/29685671
复制相似问题