Lodash键映射

3
我正在学习lodash,所以这个问题的答案可能很简单。 假设我有以下数组:
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中发布的问题类似。


1
在编程中,使用_.map()函数,并在回调函数中使用_.mapkeys()函数。 - Pointy
3个回答

6

只需使用 地图

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

或者,正如Vohuman所指出的那样,如果不考虑IE8支持,你可以简单地使用本地的map函数:

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

使用ES6,您可以使用箭头函数、参数解构和隐式返回来变得非常简洁:

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

需要注意的是,原生的 Array.prototype.map 做的事情与此相同。不需要使用 lodash。 - Ram

1
我不确定_.mapKeys()是否会从对象中删除不需要的键。 下面我为您准备了更灵活的解决方案。它可以转换为Lodash函数,使用_.mixin即可。
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);
});

1
这看起来是一个不错的解决方案,但问题明确要求使用lodash。 - hirse

0
这里有一种方法,它使用了map()pick()
_.map(arr, _.ary(_.partialRight(_.pick, 'a', 'b'), 1));

partialRight() 调用会创建一个回调函数,该函数将仅使用给定的属性名称创建新对象 — 'a''b' 是对 pick() 进行了部分应用

ary() 函数确保回调函数只接收一个参数。我们需要这样做是因为 map() 会提供多个参数,而我们的回调函数只能使用项目本身作为参数。


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