javascript - 如何使用 lodash 将两个数组(数组 1d 和数组 2d 对象)合并为一个数组
问题描述
我正在寻找最好的方法来做到这一点。我有两个数组(数组 1d 和数组 2d 对象):
let keys = [11, 12];
let values = [
[
{ name: '1', link: '1', history: '1' },
{ name: '2', link: '2', history: '2' }
],
[
{ name: '3', link: '3', history: '3' },
{ name: '4', link: '4', history: '4' }
]
]
我想要的最终结果是一个地图数组:
[
{ name: '1', link: '1', history: '1' , q : 11},
{ name: '2', link: '2', history: '2' , q : 11},
{ name: '3', link: '3', history: '3' , q : 12},
{ name: '4', link: '4', history: '4' , q : 12}
]
如何使用 lodash 以最有效/最干净的方式做到这一点?谢谢!
此代码没有 lodash :
let arr = [];
let keys = [ 29, 30 ]
let values = [
[
{ name: '1', link: '1', history: '1' },
{ name: '2', link: '2', history: '2' }
],
[
{ name: '3', link: '3', history: '3' },
{ name: '4', link: '4', history: '4' }
]
]
for (let j = 0; j < values.length; j++) {
for (let i = 0; i < values[j].length; i++) {
arr.push({ ...values[j][i], q: keys[j] });
}
}
console.log(arr)
解决方案
你可以简单地使用 _.map
let keys = [11, 12];
let values = [[{"name":"1","link":"1","history":"1"},{"name":"2","link":"2","history":"2"}],[{"name":"3","link":"3","history":"3"},{"name":"4","link":"4","history":"4"}]]
console.log(_.map(values, (v, i) => _.map(v, o => (o.q = keys[i], o))))
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.core.js"></script>
或者没有 lodash,这在语法上几乎相同
let keys = [11, 12];
let values = [[{"name":"1","link":"1","history":"1"},{"name":"2","link":"2","history":"2"}],[{"name":"3","link":"3","history":"3"},{"name":"4","link":"4","history":"4"}]]
console.log(values.map((v, i) => v.map(o => (o.q = keys[i], o))))
编辑:我忘记了结果数组必须是一维的。- lodash 变体需要在结果上获得一些 _.flatten - 本机 js 需要一个 .flat()
最后,可以使用 lodash/fp 来获得一些链接样式
let keys = [11, 12];
let values = [[{"name":"1","link":"1","history":"1"},{"name":"2","link":"2","history":"2"}],[{"name":"3","link":"3","history":"3"},{"name":"4","link":"4","history":"4"}]]
console.log(
_.flow(
// we need to use entries to get the index of fp.map
_.entries,
// for each array
_.map(([i, v]) =>
// foreach "history" of the array
_.map(
// merge the key to the current "history"
_.merge({ q: keys[i] }), v)
),
_.flatten
)(values)
)
console.log(
_.flow(
// or its variant
_.map.convert({ cap: false })((v,i) => _.map(_.merge({ q: keys[i] }), v)),
_.flatten
)(values)
)
<script src="https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js"></script>
推荐阅读
- opengl - 无法让纹理在 Common Lisp 中的 OpenGL 中工作
- tensorflow - 如何提高对相似对象的图像分类的准确性并降低过拟合
- r - R:在图上叠加集群
- reactjs - Redux reducer:当数组没有对象数据时将对象添加到数组
- node.js - .find 不是sails js mongodb中的函数
- python - 保存以十进制计的棒球局
- c++ - 如何在使用 C++ 显示文本文件中的文本时有条件
- javascript - 在js中从两个单独的给定日期添加新对象
- javascript - 无法在颤动的 web 视图中打开 tel、mailto、whatsapp 链接?
- python - 搜索游戏文件并增加替换 pid#