首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将javascript字典键映射到新键

如何将javascript字典键映射到新键
EN

Stack Overflow用户
提问于 2015-04-16 20:50:05
回答 4查看 73关注 0票数 0

我有一个包含windows os版本的字典,例如:

代码语言:javascript
复制
{
  "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的地图,例如:

代码语言:javascript
复制
Microsoft Windows NT 6.1.*->windows 7
Microsoft Windows NT 6.2.*->windows 8

那么,我如何用格式将旧字典映射到新字典:

代码语言:javascript
复制
{
  "64-bit Microsoft Windows 8": 1,
  "32-bit Microsoft Windows 8": 2,
  "64-bit Microsoft Windows 7": 7
}

谢谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-04-16 21:18:32

在键上使用for..inString.prototype.replace,您可以将类似的东西放在一起

代码语言:javascript
复制
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
} */
票数 0
EN

Stack Overflow用户

发布于 2015-04-16 21:07:17

另一种选择是使用正则表达式来匹配目标,如下所示:

代码语言:javascript
复制
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);

它将产生:

代码语言:javascript
复制
{ '64-bit Microsoft Windows 8': 1,
  '32-bit Microsoft Windows 8': 2,
  '64-bit Microsoft Windows 7': 7 }

已更新

正则表达式可以更精确一些,通过将它们锚定到字符串的开头和结尾,从而暴露可能的外围情况,如下所示:

代码语言:javascript
复制
`/^64-bit.+?NT\s6\.1.+$/`

可描述为:

代码语言:javascript
复制
^            # 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

您还可以报告与目标模式不匹配的目标,方法是重构如下:

代码语言:javascript
复制
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)
  }
}
票数 1
EN

Stack Overflow用户

发布于 2015-04-16 21:00:18

您可以遍历该对象,并根据需要对它们进行更改。

例如:

代码语言:javascript
复制
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/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29685671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档