第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何從 JavaScript 中的嵌套對象數(shù)組遞歸創(chuàng)建平面數(shù)組?

如何從 JavaScript 中的嵌套對象數(shù)組遞歸創(chuàng)建平面數(shù)組?

心有法竹 2023-08-18 14:36:11
我想轉(zhuǎn)換以下數(shù)據(jù)結(jié)構(gòu):const data = [  {    regions: ['United States', 'Canada']  },  {    regions: ['United States']  },  {    prop1: {      regions: ['Canada']    }  },  {    prop2: [      {        regions: ['Mexico', 'United States'],        prop3: {          regions: ['Canada']        }      }    ]  }];轉(zhuǎn)化為以下數(shù)據(jù)結(jié)構(gòu):['United States', 'Canada', 'United States', 'Canada', 'Mexico', 'United States', 'Canada']為了安全起見,我希望使用 ES6 來遞歸地執(zhí)行此操作.reduce。.map這是我到目前為止所嘗試過的,但它只深入了 2 層:export const flattenArray = (arr: Object[], prop: string): any[] =>  arr.reduce(    (a, c) => [      ...new Set([        ...a,        ...c.map(x => x[prop]).reduce((y, z) => [...y, ...z.map(j => j)], []),      ]),    ],    []  );更新:我沒有使用@deterjan 和他下面的解決方案。如果有人需要非.flat版本,這是他在單個函數(shù)中的解決方案.reduceexport const flatten = (obj: any, prop: string): any[] => [  ...new Set(    Object.keys(obj).reduce((a, c) => {      if (c === prop) {        if (isArray(obj[prop])) {          return [...a, ...obj[c]];        } else {          return [...a, obj[c]];        }      } else if (isArray(obj[c])) {        return [          ...a,          ...obj[c].reduce((a, c) => [...a, ...flatten(c, prop)], []),        ];      } else if (isObject(obj)) {        return [...a, ...flatten(obj[c], prop)];      } else {        return a;      }    }, [])  ),];console.log(flatten(data, 'regions'));
查看完整描述

2 回答

?
小怪獸愛吃肉

TA貢獻(xiàn)1852條經(jīng)驗 獲得超1個贊

不確定這是否是您正在尋找的,但以下代碼遞歸地將對象和數(shù)組映射到它們的“regions”鍵,并在每一步進(jìn)行展平。


function isArray(what) {

? ? return Object.prototype.toString.call(what) === '[object Array]';

}


function searchObj(obj) {

? ? return Object.keys(obj).map(key => {

? ? ? ? if (key == "regions" && isArray(obj.regions)) return obj[key];

? ? ? ? else if (isArray(obj[key])) return searchArray(obj[key]);

? ? ? ? else if (typeof obj === "object") return searchObj(obj[key]);

? ? ? ? else return [];

? ? }).flat();

}


function searchArray(obj) {

? ? return obj.map(elem => searchObj(elem)).flat();

}

用法:


searchObj(data)

> ["United States", "Canada", "United States", "Canada", "Mexico", "United States", "Canada"]


Array.prototype.flat||Object.defineProperty(Array.prototype,"flat",{configurable:!0,value:function r(){var t=isNaN(arguments[0])?1:Number(arguments[0]);return t?Array.prototype.reduce.call(this,function(a,e){return Array.isArray(e)?a.push.apply(a,r.call(e,t-1)):a.push(e),a},[]):Array.prototype.slice.call(this)},writable:!0}),Array.prototype.flatMap||Object.defineProperty(Array.prototype,"flatMap",{configurable:!0,value:function(r){return Array.prototype.map.apply(this,arguments).flat()},writable:!0})


查看完整回答
反對 回復(fù) 2023-08-18
?
慕虎7371278

TA貢獻(xiàn)1802條經(jīng)驗 獲得超4個贊

這是一個使用對象作為 json 的解決方案,然后使用正則表達(dá)式在其中進(jìn)行搜索。我猜想存在其他方法以更好的方式構(gòu)建正則表達(dá)式,因為我必須使用替換方法來刪除引號。您可以使用一些衡量性能的工具。


const data = {

  sourceId: {

    S: "some_string"

  },

  ignored: {

    BOOL: false

  },

  stepFunctionArn: {

    S: "some_string"

  },

  certificate: {

    BOOL: true

  },

  infoNeeded: {

    L: [

      "Array"

    ]

  },

  queuesLinks: {

    M: [

      "Object"

    ]

  },

};



[...JSON.stringify(data).matchAll(/(?:\"regions\"\:\[)(?:\")(.*?)(?:\")\]/gi)].reduce(function(a, v) {

  a = a.concat(v[1].replace(/\"/g,"").split(','));

  return a;

}, [])


查看完整回答
反對 回復(fù) 2023-08-18
  • 2 回答
  • 0 關(guān)注
  • 178 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號