使用lodash重新映射属性名称和值

6

I have this array:

aItems = [{
    "PropertyA": "apple",
    "PropertyB": "banana",
    "PropertyC": "dog",
    "PropertyD": "hotdog",
    "PropertyE": "coldcat",
    "PropertyF": "Y",
    "PropertyG": "N"
},
...,
{
    "PropertyA": "this",
    "PropertyB": "is",
    "PropertyC": "json",
    "PropertyD": "code",
    "PropertyE": "wow",
    "PropertyF": "N",
    "PropertyG": "N"
}]

我想使用lodash来获得这个结果:
aItems = [{
    "propertyA": "apple",
    "propertyB": "banana",
    "propertyC": "dog",
    "propertyD": "hotdog",
    "propertyE": "coldcat",
    "propertyNEW": true,
    "propertyG": false
},
...,
{
    "propertyA": "this",
    "propertyB": "is",
    "propertyC": "json",
    "propertyD": "code",
    "propertyE": "wow",
    "propertyNEW": false,
    "propertyG": false
}]

我希望能够将每个属性名映射到其他名称,并更改某些特定属性的值。使用 lodash 可以实现吗?

2个回答

11

是的,自从 lodash v3.8.0 版本以来,您可以按任意所需的方式重新映射对象。

ES5 代码

var items = [ { oldKey: 'oldValue' /*...*/ } ]

var keyMapping = { oldKey: 'newKey' /*...*/ }
var valueMapping = { oldValue: 'newValue' /*...*/ }

var remapper = function(item){
  return _(item) // lodash chain start
    .mapKeys( function(v, k){ return keyMapping[k] } )
    .mapValues( function(v){ return valueMapping[v] } )
    .value() // lodash chain end
}

var remappedItems = items.map(remapper)

ES2015/ES6代码

let items = [ { oldKey: 'oldValue' /*...*/ } ]

let keyMapping = { oldKey: 'newKey' /*...*/ }
let valueMapping = { oldValue: 'newValue' /*...*/ }

let remapper = item => _(item) // lodash chain start
  .mapKeys( (v, k)=> keyMapping[k] )
  .mapValues( v => valueMapping[v] )
  .value() // lodash chain end

let remappedItems = items.map(remapper)

1
如果您想要所有的键值对,并且只想更改一两个键,而不想在keyMapping中列出所有的键,则可以将以下代码进行更改:<br/> .mapKeys( (v, k)=> keyMapping[k] ) <br/> 更改为 <br/> .mapKeys( (v, k)=> keyMapping[k] || k) - Roger

4
创建一个旧键和新键的映射,就像这样:
var keyMapping = {'PropertyA': 'propertyA', ..., 'PropertyF': 'propertyNEW'}

并且需要一个旧值和新值的映射,如下所示。
var valueMapping = {'Y': true, 'F': false}

然后使用_.map_.transform,可以像这样转换对象:

var result = _.map(allItems, function(currentObject) {
    return _.transform(currentObject, function(result, value, key) {
        if (key === 'PropertyF' || key === 'PropertyG') {
            value = valueMapping(value);
        }
        result[keyMapping[key]] = value;
    });
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接