密钥的lodash映射

问题描述 投票:3回答:3

我只是把目光投向了洛达什,所以这个问题的答案可能很简单。

说我有以下数组:

var arr = [{ a: 2, b: 3, c: 4 }, { a: 1, b: 4, c: 2 }];

我想重命名一些键(对于所有对象)并删除另一个键,以提供以下新数组:

var newArr = [{ x: 2, y: 4 }, { x: 1, y: 2 }];

那么,那就是将a,c重命名为x,y,然后丢弃b。

使用lodash最好的方法是什么?我认为应该使用mapKeys,但这需要一个对象作为输入而不是集合。

这与lodash multidimensional pluck发布的问题类似。

javascript lodash
3个回答
6
投票

只需使用map

_.map(arr, function(obj) { return { x: obj.a, y: obj.c } });

或者,正如Vohuman所说,你可以简单地使用原生的map函数(如果IE8 support不是问题):

arr.map(function(obj) { return { x: obj.a, y: obj.c } });

使用ES6,您可以非常简洁地使用arrow functions,参数destructuring和隐式返回:

arr.map(({a, c}) => ({ x: a, y: c }));

1
投票

我不确定_.mapKeys()是否会从对象中删除不需要的密钥。下面我为您的任务准备了更灵活的解决方案。它可以用_.mixin转换为Lodash函数。

var arr = [{ a: 2, b: 3, c: 4 }, { a: 1, b: 4, c: 2 }];

// mapping keys (if not presented - will be removed)
var keysMap = {
    a: 'x',
    c: 'y'
};

var newArr = arr.map(function(a){
    var o = {};
    Object.keys(a).forEach(function(k){
        if(Object.keys(keysMap).indexOf(k) >= 0){
            o[keysMap[k]] = a[k];
        }
    });
    return o;
});

// newArr: [{x: 2, y: 4}, {x: 1, y: 2}]

编辑:

Lodash解决方案(应该更具可读性):

var arr = [{ a: 2, b: 3, c: 4 }, { a: 1, b: 4, c: 2 }];

_.mixin({
    mapObject: function(o, keysMap){
        var n = {};
        _.each(keysMap, function(v, k){
            if(!!o[k]){
                n[v] = o[k];
            }
        });
        return n;
    }
});

var keysMap = {
    a: 'x',
    c: 'y'
};

var newArr = _.map(arr, function(a){
    return _.mapObject(a, keysMap);
});

0
投票

这是一种使用map()pick()的方法:

_.map(arr, _.ary(_.partialRight(_.pick, 'a', 'b'), 1));

partialRight()调用创建一个回调函数,它将创建仅具有给定属性名称的新对象 - 'a''b'部分应用于pick()

ary()函数确保只有一个参数传递给回调。我们需要这个,因为map()将提供几个参数,而我们的回调函数只能将项本身作为参数。

© www.soinside.com 2019 - 2024. All rights reserved.