使用Lodash查找更新嵌套对象属性仅返回外层对象如何解决
问题根因
你当前调用_.find(data, 匹配规则)时,_.find只会遍历你传入的第一个参数(也就是最外层的data数组)的顶层元素,返回符合匹配规则的顶层对象,因此自然只能拿到name为I的外层对象,无法定位到深层的specifics子元素。
解决方案
因为JavaScript中对象是引用类型,你只要定位到目标specifics子对象,直接修改属性就会同步更新原数组,不需要额外操作。以下是两种常用实现方式:
方式1:扁平化数组快速查找(代码简洁,适合层级固定的场景)
先把所有层级的specifics对象扁平化为一维数组,再直接查找目标:
var data = [ { name: 'I', status: "0", categories: [ { name: 'I1', status: "0", specifics: [ { name: "I1a", status: "0", } ] } ] } ]; // 扁平化提取所有specifics对象 const allSpecifics = _.flatMap(data, topItem => { return _.flatMap(topItem.categories, cate => cate.specifics) }) // 查找目标对象 const target = _.find(allSpecifics, { name: 'I1a' }) // 直接更新属性 if (target) { target.status = '1' } console.log(data[0].categories[0].specifics[0].status) // 输出 1
方式2:逐层遍历查找(可提前终止,适合数据量较大的场景)
逐层遍历嵌套数组,找到目标后立刻终止循环,性能更高:
let target = null _.forEach(data, topItem => { _.forEach(topItem.categories, cateItem => { const findRes = _.find(cateItem.specifics, { name: 'I1a' }) if (findRes) { target = findRes return false // 终止当前层循环 } }) if (target) return false // 终止外层循环 }) if (target) { target.status = '1' }
内容的提问来源于stack exchange,提问作者Mevia
相关产品推荐
相关产品推荐

