程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了从数组和对象的深度嵌套对象中返回所有 id大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决从数组和对象的深度嵌套对象中返回所有 id?

开发过程中遇到从数组和对象的深度嵌套对象中返回所有 id的问题如何解决?下面主要结合日常开发的经验,给出你关于从数组和对象的深度嵌套对象中返回所有 id的解决方法建议,希望对你解决从数组和对象的深度嵌套对象中返回所有 id有所启发或帮助;

假设我有这个深度嵌套的对象

let obj = {
  comp: "el",type: "ele",children: [
    {
      children: [
        {
          text: "text",children: [],uID: "-5zIANJjCz-qU0MNcf5E1",},{
          text:"text",uID: "bpeVj4NaD_Io3WP7V0v91"
        }
      ],uID: "ZygtUliVsFbFpbmHv5yp9"
    },{
      children: [
        {
          text: "text",uID: "qmw59v1BVRMEuM8r9VvQp",{
          text: "text. ",uID: "q-QeWlEnKvVTjD0dPRXCu"
        }
      ],uID: "rp_gURLfigd1n7bn-pRhn"
    },uID: "8gIytZ52tq0mqiVAhAJLN",{
          text: "text",uID: "q-QeeWlEnKvVTjD0dPRXCu"
        }
      ],uID: "M3hqA-Rp1wQz60IVdIGUX"
    }
  ],uID: "M4JBL9SoOolo5iQSb5M_P"
};

我将如何获取所有 uID 值的数组?

目前我正在使用对象扫描

https://github.com/blackflux/object-scan

const find = (data,needlE) => objectScan([needle],{ rtn: "value" })(data);
const allIDs = find(obj,"**.uID");

这非常有效,但我很好奇如何通过递归实现这一点。

解决方法

使用一个简单的辅助函数来收集结果与使用它来获取每个访问过的节点的 id 的结果配对非常容易::

const gather = (fn) => (o) => 
  [fn (o),... (o .children || []) .flatMap (gather (fn))]

const obj = {Comp: "el",type: "ele",children: [{Children: [{text: "text",children: [],uid: "-5zIANJjCz-qU0MNcf5E1"},{text: "text",uid: "bpeVj4NaD_Io3WP7V0v91"}],uid: "ZygtUliVsFbFpbmHv5yp9"},{Children: [{text: "text",uid: "qmw59v1BVRMEuM8r9VvQp"},{text: "text. ",uid: "q-QeWlEnKvVTjD0dPRXCu"}],uid: "rp_gURLFIgd1n7bn-pRhn"},uid: "8gIytZ52tq0mqiVAhAJLN"},uid: "q-QeeWlEnKvVTjD0dPRXCu"}],uid: "M3hqA-Rp1wQz60IVdIGUX"}],uid: "M4JBL9SoOOLo5iQSb5M_P"}

console .log (gather (x => x .uid) (obj))

//   or,storing the uid function in a Helper: 
// const extractUids = gather (x => x .uid)
// console .log (extractUids (obj))

但是如果您对通用解决方案没有其他需求,您也可以将该助手直接内联到函数中:

const extractUids = (o) => 
  [o .uid,... (o .children || []) .flatMap (extractUids)]
,

对于树(和没有环的图),您可以使用简单的基于递归的策略,如下所示:

function reduCETree<Item,Acc>(
    next: (item: Item) => Item[],reducer: (acc: Acc,item: Item) => Acc
) {
    const step = (acc: Acc,item: Item): Acc => next(item)
        .reduce((_,child) => step(_,child),reducer(acc,item));
    return step;
}

// Test
const allIds = reduCETree(
    (item: TreeItem) => item.children,(allIds: String[],item) => [...allIds,item.uid]
)(
    [],obj
);

TS Playground

,

您可以使用递归生成器函数:

function* get_uid(d){
   yield* ('uid' in d ? [d.uid] : [])
   for (var c of ('children' in d ? d.children : [])){
      yield* get_uid(C)
   }
}
let obj = {'comp': 'el','type': 'ele','children': [{'children': [{'text': 'text','children': [],'uid': '-5zIANJjCz-qU0MNcf5E1'},{'text': 'text','uid': 'bpeVj4NaD_Io3WP7V0v91'}],'uid': 'ZygtUliVsFbFpbmHv5yp9'},{'children': [{'text': 'text','uid': 'qmw59v1BVRMEuM8r9VvQp'},{'text': 'text. ','uid': 'q-QeWlEnKvVTjD0dPRXCu'}],'uid': 'rp_gURLFIgd1n7bn-pRhn'},'uid': '8gIytZ52tq0mqiVAhAJLN'},'uid': 'q-QeeWlEnKvVTjD0dPRXCu'}],'uid': 'M3hqA-Rp1wQz60IVdIGUX'}],'uid': 'M4JBL9SoOOLo5iQSb5M_P'}
var result = [...get_uid(obj)]
console.log(result);

大佬总结

以上是大佬教程为你收集整理的从数组和对象的深度嵌套对象中返回所有 id全部内容,希望文章能够帮你解决从数组和对象的深度嵌套对象中返回所有 id所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。