js两个数组的数据处理
数组一:
arr1 = [
{uid: 2},
{uid: 3},
{uid: 4}
]
数组二:
arr2 = [
{
text: '随便1',
children: [
{uid: 1},
{uid: 2}
]
},
{
text: '随便2',
children: [
{uid: 3},
{uid: 4}
]
},
{
text: '随便3',
children: [
{uid: 5},
{uid: 6}
]
}
]
想得到的效果
arr2 = [
{
text: '随便1',
children: [
{uid: 1, checked: false},
{uid: 2, checked: true}
]
},
{
text: '随便2',
children: [
{uid: 3, checked: true},
{uid: 4, checked: true}
]
},
{
text: '随便3',
children: [
{uid: 5, checked: false},
{uid: 6, checked: false}
]
}
]
数组arr1 中的uid的值对应在数组arr2 中添加属性 checked: true, 反之就是false。
请大神们帮我看看这个问题... 万分感谢。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
@边城 的答案提到深拷贝麻烦,其他答案目前也没有深拷贝的写法,我写一个作为补充,好像也不是很麻烦,语义也很清晰:
主要是使用扩展运算符(...) 和
Array.prototype.map
。这两者都只是浅拷贝,但arr2
只有 4 层,要操作的数据正好在最深层,所以这两者正好用 4 次完成深拷贝。map
单独换了一行,这样应该更能体现嵌套关系。分析
首先,这个真不需要用递归,因为不存在多级相同结构数据的情况。
说起来,其实就是遍历所有
children
项,然后去arr1
里查uid
,根据查询结果添加checked
属性。所以可以预见是两层循环,第一层遍历
arr2
的所有元素,第二层对每个元素遍历其children
。接下来要解决怎么查询的问题。遍历
children
的时候,每个child
的uid
是拿得到的,这个就是要查询的值。而要在
arr1
里去查询,无非几种办法:遍历法,可以用
Array
上定义的几个方法:some()
、find()/findIndex()
、includes()
等,arr1
变成一个表。因为只需要判断在/不在,所以不需要用Map
,用Set
就好。注意Set
对象只需要生成一次,然后在每个循环体里使用就成。下面的示例代码是使用查表法写的,所以不单独写代码示例。示例代码
有几点需要注意:
checkIds
用后即毁,不污染环境arr2
原数据上修改的,而不是产生的新对像(深拷贝麻烦,如果不是一定要保留的数组干净,就不考虑深拷贝了)简单来说使用了递归
结果
我个人还是喜欢用最纯粹的方法来解各种算法问题,虽然用数组方法会更方便,但这有利于对解题思路和逻辑的理解,无论是map、forEach或是some,底层都离不开一层循环,归根结底还是要遍历数组,然后判断uid的值是否存在于另一个数组中,再把checked值添加进对象。