JavaScript 中的 C# 字典等效项

Posted

技术标签:

【中文标题】JavaScript 中的 C# 字典等效项【英文标题】:C# Dictionary equivalent in JavaScript 【发布时间】:2015-01-22 08:33:46 【问题描述】:

javascript 中是否存在任何类型的 c# 字典。我在 angularjs 中有一个应用程序,它从 MVC Web Api 请求数据,一旦获得,它就会对其进行一些更改。所以数据是一个对象数组,它作为对象字典存储在 MVC Web Api 中,但我在通过网络传递它之前将其转换为列表。

如果我将 Dictionary 直接转换为 JSON,我会得到类似的结果:

array = [ Id:"1", Id:"1", Name:"Kevin Shields", 
          Id:"2", Id:"2", Name:"Natasha Romanoff"
        ];

嗯,这些对象有点复杂,但你现在有了一个想法。问题是这种格式更难操作(我有字母键或ID)。那么有没有相当于字典的东西?这样做很简单:

Object o = dictionary["1"];

就是这样,先谢谢了。

【问题讨论】:

***.com/questions/368280/… 如果您可以假设键是唯一的,只需创建一个对象。如果不能,则需要构造两个数组 如果您的查找键是唯一字符串(或很容易转换为唯一字符串),那么 Javascript 对象可以很好地存储和查找与键关联的键和数据。 【参考方案1】:

是的,它被称为object。对象具有键和值,就像 C# 字典一样。键始终是字符串。

在您的情况下,对象将如下所示:


    "1": 
        "Id": 1, 
        "Name":" Kevin Shields"
    , 
    "2": 
        "Id": 2, 
        "Name": "Natasha Romanoff"
    

默认的 ASP.net 序列化程序会生成丑陋的 JSON。更好的选择是Json.NET。

【讨论】:

var dict = <your-code> 问题是dict.length === 0,所以即使是基本的 c# 字典也不起作用。【参考方案2】:

您确实有两个选择,尽管两者本质上都做同样的事情,但如果您想定制解决方案,可能值得多读一点 here,其中谈到了关联数组(字典):

var dictionary = new Array(); 
dictionary['key'] = 'value'

或者:

var dict = []; 

dict.push(
    key:   'key',
    value: 'value'
);

更新

从 ES2015 开始你可以使用Map():

const dict = new Map();
dict.set('propertyName', propertyValue);

【讨论】:

链接是 404。第一个示例问题:dictionary.length === 0 第二个示例问题:dict['key'] === undefined。所以这些都不是一个基本的 C# 字典。 这是正确的答案,目前,如果将字典从 javascript 发送到控制器。 NewtonSoft 和 System.Text.Json 都不可信。 NewtonSoft 的序列化 json 在网络框架的反序列化中无法生存,并且 System.Text.Json 引发 System.NotSupportedException 因为它不执行 Dictionary 例如。【参考方案3】:

我的例子:

var dict = new Array();
// add a key named id with value 111
dict.id = 111;
//change value of id
dict.id = "blablabla";
//another way
// add a key named name with value "myName"
dict["name"] = "myName";
//and delete
delete dict.id;
delete dict["name"]

//another way
dict = 
  id:    111,
  "name": "myName"
;

//And also another way create associate array
var myMap =  key: [ value1, value2 ] ;

【讨论】:

【参考方案4】:

我知道这个问题有点老了,但是在 ES2015 中有一个名为 map 的新数据结构,它更类似于您在 C# 中使用的字典。因此,现在您不必将其伪造为对象或数组。

MDN 很好地涵盖了它。 ES2015 Map

【讨论】:

支持 c# 基本字典方法(js:size === c#:count, js:set === c#:add 等)。

以上是关于JavaScript 中的 C# 字典等效项的主要内容,如果未能解决你的问题,请参考以下文章

C# 中的 Jaxb 等效项

C# 中的 Jaxb 等效项

TypeScript hasOwnProperty 等效项

C# 中的 DWORD 和 VARTYPE 等效项

如何最有效地测试两个数组是不是包含 C# 中的等效项

C# 默认关键字在 F# 中的等效项是啥?