Lodash中的map和pick

7

给定一个数组

var test = [{a:1, b:2, c:3}, {a:4, b:5, c:6}, {a:7, b:8, c:9}]

如何使用lodash获取类似于[{b:2, c:3}, {b:5, c:6}, {b:8, c:9}]的新对象数组?

我尝试过_.map(test, _pick(???, ['b', 'c'])},但是我应该在??? 中放什么呢?


https://lodash.com/docs#map,https://lodash.com/docs#pick - Heretic Monkey
5个回答

12
你需要将函数传递给map方法,使用ES6时可以像这样使用箭头函数。

var test = [{a:1, b:2, c:3}, {a:4, b:5, c:6}, {a:7, b:8, c:9}]

var result = _.map(test, e => _.pick(e, ['b', 'c']))
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.min.js"></script>

10

这与所提出的问题无关,可以轻松地通过ES6完成。

test.map(({ b, c }) => { 
  return { b, c }
});

6
在简单情况下,更简洁的写法是:test.map(({ b, c }) => ({ b, c }));,意思不变。 - Kerrigan Joseph
这样写更加简洁美观,但为了与所提出的问题等效,您还需要检查test不是null或适当处理错误。如果test为null,Lodash将返回一个空数组。 - Andrew
1
那种方法非常有限,因为映射函数无法预定义 - 每次都需要创建定制的映射函数。使用字符串数组例如 ['b', 'c'],意味着您可以创建一个可重复使用的函数,在其中首先传递属性路径的数组,然后返回映射函数。 - Drenai

1
如果你使用 Babel(ES6),可以使用解构来解决问题,不需要使用 lodash。

var test = [{a:1, b:2, c:3}, {a:4, b:5, c:6}, {a:7, b:8, c:9}]

let newList = test.map(({b, c})=>{
 return {b,c}
});

document.body.append(JSON.stringify(newList));


0

_.partialRight() 可以用于 @Sean 的试验,例如 _.map(test, _pick(???, ['b', 'c']))

_.map(test, _.partialRight(_.pick, ['b', 'c']));

// result: [ { b: 2, c: 3 }, { b: 5, c: 6 }, { b: 8, c: 9 } ]

0
_.chain(test).map(function(e){return _.pick(e, ['b','c'])}).value();

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