如何用Underscore判断深度嵌套对象数组的对象存在性并找出数组差异?
嘿,我来帮你搞定这两个Underscore.js的问题,都是开发中经常碰到的场景,咱们一个个拆解清楚:
一、判断深度嵌套对象数组中是否存在目标对象
深度嵌套的数组没法直接用浅层的_.some或_.find搞定,得结合递归遍历才能挖到最底层的对象。核心思路是:遍历数组每一项,要是当前项是子数组就递归检查;要是对象,就和目标对象做对比——这里要注意,直接用===对比对象是比引用,所以得用Underscore的_.isEqual做深度键值对匹配。
给你写个开箱即用的函数:
function isObjectInNestedArray(nestedArray, targetObj) { return _.some(nestedArray, function(item) { // 遇到子数组就递归深入 if (_.isArray(item)) { return isObjectInNestedArray(item, targetObj); } // 遇到对象就做深度对比 if (_.isObject(item)) { return _.isEqual(item, targetObj); } // 非对象非数组的项直接跳过 return false; }); }
用法示例:
const nestedData = [ { id: 1, name: "Layer A" }, [ { id: 2, name: "Layer B" }, [{ id: 3, name: "Layer C" }] ] ]; const target = { id: 3, name: "Layer C" }; console.log(isObjectInNestedArray(nestedData, target)); // 输出 true
如果你的需求只需要匹配对象的部分键(比如只看id),可以把_.isEqual换成自定义逻辑,比如return item.id === targetObj.id,这样性能会更好。
二、筛选数据数组中未出现在偏好models中的项
先明确下你的数据结构(方便后续理解):
localStorageLayers(数据数组):每个元素是带attributes键的对象,比如{ attributes: { id: 1, name: "Layer1" }, ... }layerPrefs(偏好对象):包含models数组,每个model同样带attributes键,比如{ models: [{ attributes: { id: 1, name: "Layer1" } }, ...] }
咱们的目标是找出localStorageLayers里,其attributes不在layerPrefs.models的attributes集合中的项,这里给你两种方案,按需选择:
方案1:基于唯一标识(比如id)对比(推荐,性能更优)
如果你的attributes里有唯一键(比如id),优先用这个方案,因为比对单个值比深度比对整个对象快得多:
// 第一步:提取偏好中所有attributes的id,存成数组 const prefLayerIds = _.pluck(_.pluck(layerPrefs.models, 'attributes'), 'id'); // 第二步:筛选出localStorageLayers中id不在偏好集合里的项 const unmatchedLayers = _.reject(localStorageLayers, function(layer) { return _.includes(prefLayerIds, layer.attributes.id); });
方案2:深度对比整个attributes对象
如果必须严格匹配attributes的所有键值对(比如没有唯一id,或者需要完全一致),就用_.some结合_.isEqual做深度比对:
// 第一步:提取偏好中所有的attributes对象 const prefAttributes = _.pluck(layerPrefs.models, 'attributes'); // 第二步:筛选出localStorageLayers中attributes不在偏好集合里的项 const unmatchedLayers = _.reject(localStorageLayers, function(layer) { return _.some(prefAttributes, function(prefAttr) { return _.isEqual(prefAttr, layer.attributes); }); });
注意:如果你的数组规模很大,这个方案的性能会比方案1差一些,所以优先考虑用唯一键做比对。
内容的提问来源于stack exchange,提问作者John Lippson
相关产品推荐
相关产品推荐

