2017-08-06 110 views
1

我有一个JSON对象,我试图用它们的值交换密钥。这些值都是唯一的,但键不是。由于它们不是唯一的,所以在创建对象时,将删除非唯一键。交换JSON密钥和值

无论如何我可以在创建对象之前反转键和值吗?我试图用下划线做这个,但是这个库只允许你反转对象。

<!DOCTYPE html> 
<html> 
    <body> 
    <script src="http://underscorejs.org/underscore-min.js"></script> 
     <script> 
     var myObj = { 
       "503": "07:25", 
       "507": "06:00", 
       "500x": "06:50", 
       "500x": "07:20", 
       "500": "07:35", 
       "503": "07:50", 
       "507": "07:40", 
       "500x": "07:55", 
       "500": "08:30", 
       "500x": "08:00", 
       "500": "10:45", 
       "507": "09:05", 
       "500": "10:45", 
       "507": "09:05", 
       "500": "13:45", 
       "500": "16:45", 
       "500": "20:00", 
       "500": "22:00", 
       "500N\n*Thur/Fri Only": "23:00" 
     }, 

     myObj = _.invert(myObj), 
     keys = Object.keys(myObj), 
     values = Object.values(myObj), 
     i, len = values.length; 
     console.log("Total len = " + len) 
     values.sort(); 

     console.log(myObj); 

    for (i = 0; i < len; i++) { 
     k = keys[i]; 
     v = values[i]; 
     console.log(k + ': ' + v); 
    } 
     </script> 
    </body> 
</html> 
+2

过得好MyObj中?如果myObj已经创建,那么数据丢失 – marvel308

+0

我有一个文件,其中包含这种格式的所有JSON:https://pastebin.com/Ppv7in9t – William

+0

对不起,但这不是有效的JSON。密钥在JSON中必须是唯一的。 – vasekhlav

回答

1

如果您可以将您的OBJ转换为字符串,然后使用正则表达式,你可以得到的话""之间,然后用for循环组他们在一起。

注意:你需要转义\n里面的字符串。

const myObj = '{"503": "07:25","507": "06:00","500x": "06:50","500x": "07:20","500": "07:35","503": "07:50","507": "07:40","500x": "07:55","500": "08:30","500x": "08:00","500": "10:45","507": "09:05","500": "10:45","507": "09:05","500": "13:45","500": "16:45","500": "20:00","500": "22:00", "500N\\n*Thur/Fri Only" : "23:00"}'; 
 
     
 
var result = myObj.match(/"(.*?)"/gm).reduce((res,word)=>{ 
 
    res.push(word.replace(/"/g,'')); 
 
    return res; 
 
},[]); 
 

 
var swapped = {}; 
 
for(let i = 0 ; i < result.length - 1; i += 2){ 
 
    swapped[result[i + 1]] =result[i] 
 
} 
 

 
console.log(swapped);

+2

感谢您使用此解决方案。这适用于我的情况。我将它标记为正确的答案,因为数据已经是一个删除非唯一键的对象,所以它不能用javascript解决。 – William

0

使用此代码:

var myObj = { 
 
"503": "07:25", 
 
"507": "06:00", 
 
"500x": "06:50", 
 
"500x": "07:20", 
 
"500": "07:35", 
 
"503": "07:50", 
 
"507": "07:40", 
 
"500x": "07:55", 
 
"500": "08:30", 
 
"500x": "08:00", 
 
"500": "10:45", 
 
"507": "09:05", 
 
"500": "10:45", 
 
"507": "09:05", 
 
"500": "13:45", 
 
"500": "16:45", 
 
"500": "20:00", 
 
"500": "22:00", 
 
"500N\n*Thur/Fri Only": "23:00" 
 
}; 
 

 
function swap(json){ 
 
var ret = {}; 
 
for(var key in json){ 
 
ret[json[key]] = key; 
 
} 
 
return ret; 
 
} 
 

 
console.log(myObj); 
 
console.log(swap(myObj));
<!DOCTYPE html> 
 
<html> 
 
    <body> 
 
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
    <script src="http://underscorejs.org/underscore-min.js"></script> 
 
    </body> 
 
</html>

+1

这会在声明myObj变量时删除非唯一键。 – William