我只是把目光投向了洛达什,所以这个问题的答案可能很简单。
说我有以下数组:
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发布的问题类似。
只需使用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 }));
我不确定_.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);
});
_.map(arr, _.ary(_.partialRight(_.pick, 'a', 'b'), 1));
partialRight()调用创建一个回调函数,它将创建仅具有给定属性名称的新对象 - 'a'
和'b'
部分应用于pick()
。
ary()函数确保只有一个参数传递给回调。我们需要这个,因为map()
将提供几个参数,而我们的回调函数只能将项本身作为参数。