首页 > 解决方案 > 将员工数组转换为字典

问题描述

所以我目前正在使用LinqJS库来实现以下目标:

    var allEmployees = [
        {
            "Id": 1374,
            "FirstName": "John",
            "LastName": "Doe"
        },
        {
            "Id": 1375,
            "FirstName": "Jane",
            "LastName": "Doe"
        }
    ];
    var employeeDictionary = Enumerable.from(allEmployees).toDictionary("$.Id", "$.FirstName+' '+$.LastName").toEnumerable().toArray();

序列化为employeeDictionaryJSON 时,我得到以下格式:

[
  {
    "key": 1374,
    "value": "John Doe"
  },
  {
    "key": 1375,
    "value": "Jane Doe"
  }
]

我不希望我的数据采用这种格式,我希望它采用这种格式:

{
  "1374": "John Doe",
  "1375": "Jane Doe"
}

我使用YaLinqo在 PHP 中编写了类似的东西,这给了我需要的结果:

echo json_encode(from($employees)->toDictionary('$v["Id"]', '$v["FirstName"]." ".$v["LastName"]')->toArray());

但是,我希望能够在我的 JavaScript 中实现这一点。

标签: javascriptlinqlinq.js

解决方案


在 JavaScript 中,数组严格来说始终是数字索引结构。所以,.toArray遵守它。在 PHP 中,数组更接近于 JavaScript 所认为的普通对象。


如果使用这个 LINQ JavaScript 库

您可以使用该.toObject方法生成格式的对象 - 您需要传入两个函数 - 键选择器和值选择器,以便使用正确的数据构建对象:

var allEmployees = [
    {
        "Id": 1374,
        "FirstName": "John",
        "LastName": "Doe"
    },
    {
        "Id": 1375,
        "FirstName": "Jane",
        "LastName": "Doe"
    }
];
var employeeDictionary = Enumerable.from(allEmployees)
  .toDictionary("$.Id", "$.FirstName+' '+$.LastName")
  .toEnumerable()
  .toObject(entry => entry.key, entry => entry.value);

/* output:
{
  "1374": "John Doe",
  "1375": "Jane Doe"
}
*/

使用解构,键/值选择器可以转换为:

.toObject(({key}) => key, ({value}) => value);

如果将此库用于 LINQ 操作,则需要稍微更改语法:

var allEmployees = [
    {
        "Id": 1374,
        "FirstName": "John",
        "LastName": "Doe"
    },
    {
        "Id": 1375,
        "FirstName": "Jane",
        "LastName": "Doe"
    }
];
var employeeDictionary = Enumerable.From(allEmployees)
  .ToDictionary("$.Id", "$.FirstName+' '+$.LastName")
  .ToEnumerable()
  .ToObject("$.Key", "$.Value");

/* output:
{
  "1374": "John Doe",
  "1375": "Jane Doe"
}
*/

推荐阅读