記兩個JSON數(shù)據(jù)處理

2016.7

前言

工作中會經(jīng)常遇到對數(shù)據(jù)的處理业稼,入行一個多月,我目前接觸到的技術腔稀,也是日常工作中常用的语盈,是利用ajax來請求接口和后臺對接進行數(shù)據(jù)交互舱馅,數(shù)據(jù)的形式是JSON格式。這就需要我們能夠熟練地對JavaScript的對象和數(shù)組進行操作處理刀荒,尤其是對復雜的JSON嵌套形式的對象進行操作,完成我們想要達成的目的棘钞。在代碼方面缠借,目前工作上采用的依然是JavaScript最有名的類庫jQuery。

打算以后對工作中遇到以及平時接觸到的一些數(shù)據(jù)處理問題的實現(xiàn)方法進行記錄宜猜,作為個人思考和學習的筆記整理總結泼返,更多的是一些實際問題的代碼實例而非理論知識,主要是方便今后再次遇到類似問題時進行查閱姨拥。作為新手前端绅喉,有的問題也許會很簡單,甚至記錄的也并非最優(yōu)解叫乌。


遍歷對象和數(shù)組

問題一

這是我在新手交流群里看到的一道題柴罐,是FreeCodeCamp上的。
有以下數(shù)據(jù):

var contacts = [
    {
        "firstName": "Akira",
        "lastName": "Laine",
        "number": "0543236543",
        "likes": ["Pizza", "Coding", "Brownie Points"]
    },
    {
        "firstName": "Harry",
        "lastName": "Potter",
        "number": "0994372684",
        "likes": ["Hogwarts", "Magic", "Hagrid"]
    },
    {
        "firstName": "Sherlock",
        "lastName": "Holmes",
        "number": "0487345643",
        "likes": ["Intriguing Cases", "Violin"]
    },
    {
        "firstName": "Kristian",
        "lastName": "Vos",
        "number": "unknown",
        "likes": ["Javascript", "Gaming", "Foxes"]
    }
];

類似于保存了一個通訊錄憨奸,需要寫一個lookUp函數(shù)來查詢這個通訊錄革屠,lookUp有兩個參數(shù):firstName和prop。如果它們都存在排宰,函數(shù)返回prop屬性對應的值似芝;如果firstName 值不存在,返回 "No such contact"板甘;如果prop 屬性不存在党瓮,返回 "No such property"。 eg. lookUp('Harry', 'number');

一開始我把這個問題想得復雜了盐类,主要還是自己基礎知識不扎實和經(jīng)驗上的欠缺寞奸。
先看給出的數(shù)據(jù)形式呛谜,contacts是一個數(shù)組作為通訊錄,里面的每一項都是一個對象(通訊錄中的人)蝇闭,對象包含了名字等信息呻率。題目是要通過一個函數(shù)傳遞人的名字和一個屬性,在通訊錄中查找呻引,如果沒有這個名字礼仗,返回一個信息;如果傳遞的屬性名不存在逻悠,又返回另一個信息元践;如果都能查找到(有這個人,這個人也有這個屬性)童谒,則返回傳遞屬性的值单旁。這里面有一個潛在的邏輯是,如果查到?jīng)]有這個名字饥伊,就不再做后面的判斷象浑,直接返回查無此人,當能查到這個人琅豆,再做其是否有這個屬性的判斷愉豺,同樣地,沒有這個屬性茫因,直接返回查無此信息蚪拦。
最開始我的思路是,將所有的firstName的value提取出來組成一個新的數(shù)組冻押,循環(huán)新數(shù)組來看參數(shù)是否匹配里面的某一項驰贷。這固然是一個辦法,不過要是對遍歷有些理解洛巢,能靈活運用括袒,就可以直接用更簡單的方式來實現(xiàn)了,于是想到了如下方法:

function lookUp(firstName, prop){
    for(var i in contacts){
        if(contacts[i].firstName == firstName){
            contacts[firstName] = contacts[i];
        }
    }
    if(!contacts[firstName]){
        return 'No such contact';
    }
    if(!contacts[firstName][prop]){
        return 'No such property';
    }
    return contacts[firstName][prop];
}

實現(xiàn)不難狼渊,用到了一個下標替換來定位參數(shù)匹配的對象箱熬。

問題二

這個是在工作上遇到的,是對一個區(qū)域ID查詢輸出該區(qū)域的省市區(qū)全稱狈邑,中國那么多地方城须,這個數(shù)據(jù)量還是挺大的,仔細看了下JSON結構米苹,大致可以概括為下面那樣:

var data = [
    { id : '1', name : 'AAA省', childs : [
        { id : '101', name : 'AA市', childs :[
            { id : '10101', name : 'A區(qū)' },
            { id : '10102', name : 'B區(qū)' }
        ]},
        { id : '102', name : 'BB縣', childs :[
            { id : '10201', name : 'A市' },
            { id : '10202', name : 'B市' }
        ]}
    ]},
    { id : '2', name : 'BBB省', childs : [
        { id : '201', name : 'CC市', childs :[
            { id : '20101', name : 'C區(qū)' },
            { id : '20102', name : 'D區(qū)' }
        ]},
        { id : '202', name : 'DD縣', childs :[
            { id : '20201', name : 'C市' },
            { id : '20202', name : 'D市' }
        ]}
    ]},
    { id : '3', name : 'CCC市', childs : [
        { id : '301', name : '市轄區(qū)', childs :[
            { id : '30101', name : 'E區(qū)' },
            { id : '30102', name : 'F區(qū)' }
        ]},
        { id : '302', name : 'DD縣', childs :[
            { id : '30201', name : 'E市' },
            { id : '30202', name : 'F市' }
        ]}
    ]}
];

比如給我們一個id20202糕伐,我們需要輸出的最終值就是BBB省DD縣D市,這個我是用笨辦法蘸嘶,層層遍歷嵌套來解決的良瞧。

function getArea(areaId){
    outLoop:
    for(var i in data){
        for(var j in data[i]['childs']){
            for(var k in data[i]['childs'][j]['childs']){
                if(areaId == data[i]['childs'][j]['childs'][k]['id']){
                    var province = data[i]['name'],
                        city = data[i]['childs'][j]['name'],
                        district = data[i]['childs'][j]['childs'][k]['name'];
                    console.log(province + city + district);
                    break outLoop;
                }
            }
        }
    }
}
getArea(20202);  //BBB省DD縣D市

需要注意兩點:遍歷對象提取鍵值對要用引號陪汽;拿到目標后終止所有嵌套循環(huán)的辦法,單純break只能終止本層循環(huán)褥蚯。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末挚冤,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子赞庶,更是在濱河造成了極大的恐慌训挡,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件歧强,死亡現(xiàn)場離奇詭異澜薄,居然都是意外死亡,警方通過查閱死者的電腦和手機摊册,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門肤京,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人茅特,你說我怎么就攤上這事忘分。” “怎么了白修?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵饭庞,是天一觀的道長。 經(jīng)常有香客問我熬荆,道長,這世上最難降的妖魔是什么绸狐? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任卤恳,我火速辦了婚禮,結果婚禮上寒矿,老公的妹妹穿的比我還像新娘突琳。我一直安慰自己,他們只是感情好符相,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布拆融。 她就那樣靜靜地躺著,像睡著了一般啊终。 火紅的嫁衣襯著肌膚如雪镜豹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天蓝牲,我揣著相機與錄音趟脂,去河邊找鬼。 笑死例衍,一個胖子當著我的面吹牛昔期,可吹牛的內(nèi)容都是我干的已卸。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼硼一,長吁一口氣:“原來是場噩夢啊……” “哼累澡!你這毒婦竟也來了?” 一聲冷哼從身側響起般贼,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤愧哟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后具伍,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體翅雏,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年人芽,在試婚紗的時候發(fā)現(xiàn)自己被綠了望几。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡萤厅,死狀恐怖橄抹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情惕味,我是刑警寧澤楼誓,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站名挥,受9級特大地震影響疟羹,放射性物質發(fā)生泄漏。R本人自食惡果不足惜禀倔,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一榄融、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧救湖,春花似錦愧杯、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至邑闺,卻和暖如春跌前,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背检吆。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工舒萎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓臂寝,卻偏偏與公主長得像章鲤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子咆贬,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內(nèi)容