lodash 选择:如果未设置键,则设置值

kei*_*kei 1 javascript lodash

我有以下两个数组:

var headerKeys = ["title","name","address"]
var resultsArr = [
    { title:"test 1", name: "test1", unrelatedKey: "blah" },
    { title:"test 2", name: "test2" }
]
Run Code Online (Sandbox Code Playgroud)

我想清理一下resultsArr,使其只有在headerKeys. 我想要的输出如下所示:

[
    { title:"test 1", name: "test1", address: "" },
    { title:"test 2", name: "test2", address: "" }
]
Run Code Online (Sandbox Code Playgroud)

这是我目前使用的代码:

_.chain(resultsArr).map(function(item){
    return _.chain(item).pick(headerKeys).value()
}).value()
Run Code Online (Sandbox Code Playgroud)

这输出:

[
    { title:"test 1", name: "test1" },
    { title:"test 2", name: "test2" }
]
Run Code Online (Sandbox Code Playgroud)

它非常接近我想要的,但它不会显示,address因为它没有设置。无论如何,即使它没有价值,也有强制它显示密钥的方法吗?

另外,如果您有关于如何改进我的 lodash 链的建议,那就太好了。

Ori*_*ori 6

您可以使用_.defaults()添加缺少的键:

var headerKeys = ["title","name","address"]
var resultsArr = [
    { title:"test 1", name: "test1", unrelatedKey: "blah" },
    { title:"test 2", name: "test2" }
];

/** create once the defaults object from the headerKeys **/
var defaultsObj = _(headerKeys)
  .mapKeys()
  .mapValues(function() { return ""; })
  .value();

var result = resultsArr.map(function(obj) {
  return _(obj)
    .pick(headerKeys)
    .defaults(defaultsObj) // apply the defaults
    .value();
});

console.log(result);
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
Run Code Online (Sandbox Code Playgroud)