如何使用Lodash在数组对象中查找并添加额外属性?
用Lodash实现数组对象的精准属性添加(无for循环/临时数据)
嘿,这问题我熟!不用for循环和临时数据处理,用Lodash的内置方法就能轻松搞定。下面给你两种简洁的实现方式:
方法一:精准定位+属性赋值
这种方式直接找到目标对象,然后添加属性,逻辑清晰明了:
const _ = require('lodash'); // 原始数据 const book = [ { "name": "Hulk", "series": [ { "name": "mike", "id": "100" }, { "name": "steve", "id": "200" } ] } ]; // 深拷贝原数据(避免修改原始数据,可根据需求省略) const updatedBook = _.cloneDeep(book); // 找到符合条件的series对象 const targetItem = _.find(updatedBook[0].series, { name: 'mike', id: '100' }); // 如果找到目标,添加detail属性 if (targetItem) { _.assign(targetItem, { detail: { author: 'apple', year: 1956 } }); } console.log(updatedBook);
方法二:链式函数式处理
如果更倾向于函数式风格,用_.update结合_.map来实现,全程无手动循环:
const _ = require('lodash'); const book = [ { "name": "Hulk", "series": [ { "name": "mike", "id": "100" }, { "name": "steve", "id": "200" } ] } ]; const updatedBook = _.update( _.cloneDeep(book), '[0].series', // 指定要修改的路径 (series) => _.map(series, (item) => { // 匹配条件则合并detail属性,否则返回原对象 return _.isMatch(item, { name: 'mike', id: '100' }) ? _.merge({}, item, { detail: { author: 'apple', year: 1956 } }) : item; }) ); console.log(updatedBook);
关键说明:
_.cloneDeep:用来深拷贝原始数据,防止修改原数据影响其他逻辑,如果你允许直接修改原数据,可以去掉这一步。_.find:通过匹配对象快速定位目标,比手动循环高效且简洁。_.update+_.map:函数式的处理方式,通过路径定位到series数组,遍历并修改匹配项,全程无需手动写循环。
两种方法都能得到你期望的结果,返回完整的book数据,且目标series对象会新增detail属性。
内容的提问来源于stack exchange,提问作者Balasubramanian
相关产品推荐
相关产品推荐

