最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用JavaScript遞歸函數(shù)封裝一個(gè)超級(jí)實(shí)用的轉(zhuǎn)換場(chǎng)景

 更新時(shí)間:2024年11月01日 08:21:48   作者:前端霧戀  
這篇文章主要為大家詳細(xì)介紹了如何使用JavaScript遞歸函數(shù)封裝一個(gè)超級(jí)實(shí)用的轉(zhuǎn)換場(chǎng)景,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下

場(chǎng)景

我相信很多同學(xué)都遇到過這樣的場(chǎng)景,如果一個(gè)數(shù)組中有一個(gè)name字段,但是我們?cè)谑褂玫臅r(shí)候需要的是title字段。如示例代碼:

const list = [{ name: '張三' }];
// 轉(zhuǎn)換為
const list = [{ title: '張三' }];

map方法

這是我們最簡(jiǎn)單的方式,直接用map方法返回一個(gè)新數(shù)組即可,相當(dāng)簡(jiǎn)單;但是我們?cè)谙胍幌?,如果每一個(gè)對(duì)象還有一個(gè)children子數(shù)組呢?這種情況map就不太好處理了。 帶著這個(gè)考慮繼續(xù)往下看,這兒就不做太多介紹因?yàn)檫@太簡(jiǎn)單了。

const list = [{ name: '張三' }];
console.log(list.map(v=>{
return { title: v.name }
}));

單場(chǎng)景版本

大家看以下代碼場(chǎng)景都寫了注釋的;

主要邏輯就是根據(jù)新值和舊值進(jìn)行綁定然后賦值修改。然后我們?cè)诳紤]這么一個(gè)場(chǎng)景?如果list里面的name在obj中,這種場(chǎng)景我們有應(yīng)該怎么做?

const list = [
{
  name: '張三',
  id: 6,
  children: [
    { name: '張三-第一個(gè)兒子', id: 1 },
    { name: '張三-第二個(gè)兒子', id: 2 },
  ]
},
{
  name: '李四',
  id: 5,
  children: [
    { name: '李四-第一個(gè)兒子', id: 3 },
    { name: '李四-第二個(gè)兒子', id: 4 },
  ]
}
];

/**
* props 示例: { title: 'name', children: 'children' },
* key值是生成新數(shù)組的值,value是舊數(shù)組的值
* */
function recursion(list, props) {
let data = [];
// 如果不是數(shù)據(jù)或者props為空就直接返回
if (!Array.isArray(list) || !props) return list; 
// .遍歷數(shù)組
for (let i = 0; i < list.length; i++) {
  // 保存一個(gè)對(duì)象
  let propsItem = {};
  // 遍歷修改值
  for (const key in props) {
    if (!list[i][props[key]]) continue;
    propsItem[key] = list[i][props[key]];
  }
  data.push(propsItem);
  // 如果子級(jí)是一個(gè)數(shù)組就遞歸賦值
  if (propsItem.children && Array.isArray(propsItem.children)) {
    data[i]['children'] = recursion(propsItem.children, props);
  }
};
return data;
};

const res = recursion(list, {
title: 'name',
children: 'children'
});
console.log('66', res);

適應(yīng)絕大部門場(chǎng)景封裝

我們查看以下示例的代碼可以發(fā)現(xiàn),不論是拿去對(duì)象內(nèi)對(duì)象的值還是對(duì)象里面的值都是可以的,基本上適用于絕大部分該類場(chǎng)景。大家在查看的時(shí)候可以針對(duì)代碼多看看都是有注釋的。

const list = [
    {
        id: 6,
        obj: { name: '張三' },
        children: [
            { obj: { name: '張三-第一個(gè)兒子', }, id: 1 },
            { obj: { name: '張三-第二個(gè)兒子', }, id: 2 },
        ]
    },
    {
        obj: { name: '李四' },
        id: 5,
        children: [
            { obj: { name: '李四-第一個(gè)兒子', }, id: 1 },
            { obj: { name: '李四-第二個(gè)兒子', }, id: 2 },
        ]
    }
];

/**
* props 示例: { title: 'obj.name', children: 'children' },
* key值是生成新數(shù)組的值,value是舊數(shù)組的值
* */
function recursion(list, props) {
    let data = [];
    // 如果不是數(shù)據(jù)或者props為空就直接返回
    if (!Array.isArray(list) || !props) return list;
    // .遍歷數(shù)組
    for (let i = 0; i < list.length; i++) {
        // 保存一個(gè)對(duì)象
        let propsItem = {};
        // 遍歷修改值
        for (const key in props) {
            // 將字符串轉(zhuǎn)為數(shù)組
            const propsKey = props[key].toString().split('.');
            // 如果數(shù)組大于等于2取其對(duì)象里面的值,反之直接拿key值
            const propsChild = propsKey.length >= 2 ? list[i][propsKey[0]][propsKey[1]] :
                propsKey.length === 1 ? list[i][propsKey[0]] : null;
            // 如果為空跳槽循環(huán)
            if (!propsChild) continue;
            propsItem[key] = propsChild;
        }
        data.push(propsItem)
        // 如果子級(jí)是一個(gè)數(shù)組就遞歸賦值
        if (propsItem.children && Array.isArray(propsItem.children)) {
            data[i]['children'] = recursion(propsItem.children, props);
        }
    };
    return data;
};

const res = recursion(list, {
    title: 'obj.name',
    children: 'children'
});
console.log('66', res);

到此這篇關(guān)于使用JavaScript遞歸函數(shù)封裝一個(gè)超級(jí)實(shí)用的轉(zhuǎn)換場(chǎng)景的文章就介紹到這了,更多相關(guān)JavaScript遞歸函數(shù)封裝轉(zhuǎn)換場(chǎng)景內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • AI小程序之語(yǔ)音聽寫來了,十分鐘掌握百度大腦語(yǔ)音聽寫全攻略

    AI小程序之語(yǔ)音聽寫來了,十分鐘掌握百度大腦語(yǔ)音聽寫全攻略

    語(yǔ)音識(shí)別極速版能將60秒以內(nèi)的完整音頻文件識(shí)別為文字,本文主要介紹采用百度語(yǔ)音識(shí)別,實(shí)現(xiàn)小程序的聽寫功能,感興趣的同學(xué)可以來了解一下
    2020-03-03
  • JavaScript中的事件循環(huán)機(jī)制解讀

    JavaScript中的事件循環(huán)機(jī)制解讀

    本文全面介紹了JavaScript的事件循環(huán)機(jī)制,包括其基本概念、組成部分、任務(wù)隊(duì)列的詳細(xì)解釋、完整的執(zhí)行流程、實(shí)際代碼演示、瀏覽器與Node.js的區(qū)別、常見面試題分析以及性能優(yōu)化技巧,通過記憶口訣“同微宏,微先走,宏之后,微清空”,幫助讀者更好地理解和應(yīng)用事件循環(huán)機(jī)制
    2025-10-10
  • Javascript的比較匯總

    Javascript的比較匯總

    本文匯總了Javascript中兩個(gè)對(duì)象的比較、不同類型的比較以及對(duì)象跟原始值的比較,并進(jìn)行了實(shí)例演示,希望能幫助到有需要的朋友們。
    2016-07-07
  • HTML+JS實(shí)現(xiàn)經(jīng)典推箱子游戲

    HTML+JS實(shí)現(xiàn)經(jīng)典推箱子游戲

    今天,這篇文章將利用HTML,CSS,JS的知識(shí)編寫一個(gè)童年經(jīng)典游戲?-?推箱子,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-11-11
  • 使用js獲取圖片原始尺寸

    使用js獲取圖片原始尺寸

    本文給大家推薦的是一個(gè)使用js獲取圖片的原始尺寸的例子,從本人項(xiàng)目中摳出來的,這里奉獻(xiàn)給大家,有需要的直接拿走。
    2014-12-12
  • JavaScript 學(xué)習(xí)筆記(七)字符串的連接

    JavaScript 學(xué)習(xí)筆記(七)字符串的連接

    javascript 字符串的連接效率問題,需要的朋友可以參考下。
    2009-12-12
  • JavaScript制作彈出層效果

    JavaScript制作彈出層效果

    彈出層效果大家在網(wǎng)站上經(jīng)常遇到此功能,下面小編給大家分享一段js代碼制作彈出層效果,代碼簡(jiǎn)單易懂,非常不錯(cuò),需要的朋友參考下吧
    2016-12-12
  • 微信小程序結(jié)合Storage實(shí)現(xiàn)搜索歷史效果

    微信小程序結(jié)合Storage實(shí)現(xiàn)搜索歷史效果

    這篇文章主要為大家詳細(xì)介紹了微信小程序結(jié)合Storage實(shí)現(xiàn)搜索歷史效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • js獲取json元素?cái)?shù)量的方法

    js獲取json元素?cái)?shù)量的方法

    這篇文章主要介紹了js獲取json元素?cái)?shù)量的方法,可實(shí)現(xiàn)對(duì)json元素?cái)?shù)量的統(tǒng)計(jì)功能,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-01-01
  • JS前端文件讀取FileReader操作方法總結(jié)

    JS前端文件讀取FileReader操作方法總結(jié)

    FileReader?包含了一套完整的事件模型,用于捕獲讀取文件時(shí)的狀態(tài),下面這篇文章主要給大家介紹了關(guān)于JS前端文件讀取FileReader操作方法的相關(guān)資料,需要的朋友可以參考下
    2024-08-08

最新評(píng)論

康平县| 瑞安市| 洛浦县| 蚌埠市| 纳雍县| 正安县| 巴林左旗| 阳东县| 五大连池市| 夹江县| 太保市| 延边| 巨野县| 哈尔滨市| 平果县| 松桃| 磴口县| 永昌县| 化隆| 西城区| 绥宁县| 内丘县| 荃湾区| 东安县| 汽车| 梁平县| 旬邑县| 秀山| 电白县| 曲水县| 广昌县| 桂平市| 莆田市| 蓝山县| 沙坪坝区| 温宿县| 阿拉善右旗| 广元市| 芮城县| 调兵山市| 慈利县|