1. 程式人生 > >記錄一次陣列的操作

記錄一次陣列的操作

運算元組的常見的方法有forEachmapfilter,其中mapfilter方法的返回值都是陣列,forEach的返回值是undefined,可以理解為沒有返回值。
由於原生的陣列物件中,沒有concatAll方法,所以打算自己實現一個。concatAll方法要做的事情很簡單,就是把一個二維陣列轉成一維。

Array.prototype.concatAll = function() {
    var result = [];

    // 用 apply 完成
    this.forEach((array) => {
        result.push.apply(result, array);
    });

    return result;
};

這裡我們用到了apply方法。apply方法會呼叫一個函式,apply方法的第一個引數會作為被呼叫函式的this值,apply方法的第二個引數(一個數組,或類陣列的物件)會作為被呼叫物件的arguments值,也就是說該陣列的各個元素將會依次成為被呼叫函式的各個引數。我們利用apply方法的這種特性,實現了陣列的解構(降維)。
接下來,我們來解決一個問題:

var courseLists = [{
  "name": "My Courses",
  "courses": [{
    "id": 511019,
    "title": "React for Beginners",
    "covers": [{
      width: 150,
      height: 200,
      url: "http://placeimg.com/150/200/tech"
    }, {
      width: 200,
      height: 200,
      url: "http://placeimg.com/200/200/tech"
    }, {
      width: 300,
      height: 200,
      url: "http://placeimg.com/300/200/tech"
    }],
    "tags": [{
      id: 1,
      name: "JavaScript"
    }],
    "rating": 5
  }, {
    "id": 511020,
    "title": "Front-End automat workflow",
    "covers": [{
      width: 150,
      height: 200,
      url: "http://placeimg.com/150/200/arch"
    }, {
      width: 200,
      height: 200,
      url: "http://placeimg.com/200/200/arch"
    }, {
      width: 300,
      height: 200,
      url: "http://placeimg.com/300/200/arch"
    }],
    "tags": [{
      "id": 2,
      "name": "gulp"
    }, {
      "id": 3,
      "name": "webpack"
    }],
    "rating": 5
  }]
}, {
  "name": "New Release",
  "courses": [{
    "id": 511022,
    "title": "Vue2 for Beginners",
    "covers": [{
      width: 150,
      height: 200,
      url: "http://placeimg.com/150/200/nature"
    }, {
      width: 200,
      height: 200,
      url: "http://placeimg.com/200/200/nature"
    }, {
      width: 300,
      height: 200,
      url: "http://placeimg.com/300/200/nature"
    }],
    "tags": [{
      id: 1,
      name: "JavaScript"
    }],
    "rating": 5
  }, {
    "id": 511023,
    "title": "Angular2 for Beginners",
    "covers": [{
      width: 150,
      height: 200,
      url: "http://placeimg.com/150/200/people"
    }, {
      width: 200,
      height: 200,
      url: "http://placeimg.com/200/200/people"
    }, {
      width: 300,
      height: 200,
      url: "http://placeimg.com/300/200/people"
    }],
    "tags": [{
      id: 1,
      name: "JavaScript"
    }],
    "rating": 5
  }]
}];

/* 
var result = courseList
不得直接使用索引 covers[0],請用 concatAll, map, filter, forEach 完成
result 結果為 [
    {
      id: 511019,
      title: "React for Beginners",
      cover: "http://placeimg.com/150/200/tech"
    }, {
      id: 511020,
      title: "Front-End automat workflow",
      cover: "http://placeimg.com/150/200/arch"
    }, {
      id: 511022,
      title: "Vue2 for Beginners",
      cover: "http://placeimg.com/150/200/nature"
    }, {
      id: 511023,
      title: "Angular2 for Beginners",
      cover: "http://placeimg.com/150/200/people"
    },
 ]
*/

這種類似的問題在我們實際的開發中是經常用到的,本人的答案如下:

var result = [];
var rel = courseLists.map((courseList) => {
    return courseList.courses;
}).concatAll().forEach((courseListItem) => {
    return result.push({
        id: courseListItem.id,
        title: courseListItem.title,
        cover: (courseListItem.covers.filter((coversItem, idx) => {
            if (idx === 0) {
                return coversItem;
            }
        }))[0].url
    })
});
console.log(result);

相關推薦

記錄陣列操作

運算元組的常見的方法有forEach、map、filter,其中map和filter方法的返回值都是陣列,forEach的返回值是undefined,可以理解為沒有返回值。 由於原生的陣列物件中,沒有concatAll方法,所以打算自己實現一個。concatAl

記錄hive大表脫敏和改造成parquet儲存動態分割槽的操作

#!/bin/bash tablename=frontlog startDate=2018-01-01 #endDate=`date -d "0 day ago" +%Y-%m-%d` DATE=`date +%Y-%m-%d` endDate=2018-08-30 #給新表增加分割槽 w

記錄使用eclipse實現git合併分支操作

首先,分支情況如下: 分支A提交所有程式碼後,建立一個分支B,又切換回分支A,對分支A進行修改。最後將分支A合併到分支B。 然後,希望的合併結果如下: 將分支A合併到分支B。其中有部分刪除檔案不用修改和刪除。 實際操作步驟: 1.分支A程式碼建立3個檔案:testA

Psotgresql如何記錄事務中每個操作的時間

實際業務需求是這樣的:在一些業務中常用的基本表修改時沒有履歷記錄,查問題時比較麻煩。 在Table上建立rule / 觸發器可以解決此問題,在實際操作中會有一個問題 以 m_ope_d為例: --記錄m_ope_d insert履歷 create rule ru

ubuntu常用命令及操作,包括安裝CUDA 記錄Python下Tensorflow安裝過程,1.7帶GPU加速版本

chmo 777 Document 這裡Document是一個資料夾,資料夾中還有好多子檔案,可以發現執行了這條指令以後,其子資料夾的許可權並沒有改變。 要想改變其子資料夾的許可權,應該執行 chmod -R 777 Document/ ubuntu desktop的英偉達CUD

記錄idea中回退已經合併到master分支並且將master主幹push到遠端回退操作

上線程式碼由於11.11大促臨時決定延期上線,但是已經合併到master並且push到遠端,所以需要回退以確保origin/master分支為線上版本 使用其中步驟: 工作中遇到git遠端倉庫需要回退到歷史版本的問題,根據網上的搜尋結果結合自己的實踐,整理了如下步驟:

記錄記錄超長”

har 語句 類型 執行 如果 可能 事情 縮小 百度 Jdbc報錯“記錄超長”,百度一下推測可能是因為SQL過長導致;但是後來經過老杜指點,發現原來是因為字段(varchar 8000)超長導致; 解決問題的套路: 1. 首先在Sql的客戶端上執行代碼;如果不錯,說明還是

[邏輯漏洞]記錄挖洞

9.png 列表 一次 查詢 urn 找到 ima sting .com 陽光明媚的早上,turn on the PC and 隨意地瀏覽著以往漏洞列表,希望在裏面找到一些遺忘的痕跡。 果然,我發現一個被忽略的漏洞,一個暴露在外網的的一個接口,可以查詢該企業網站是否註冊了的

簡單記錄REDO文件損壞報錯 ORA-00333重做日誌讀取塊出錯

clas 後者 利用 實例恢復 poi cancel true cover html 一.故障描寫敘述 首先是實例恢復須要用到的REDO文件損壞 二、解決方法 1.對於非當前REDO或者當前REDO可是無活動事務使用下面CLEAR命令: 用CLEAR命令重建該日誌

記錄配置http跳轉https的過程

http https 網站跳轉 公司最近搞了一個數據運營平臺,這個平臺會以web界面的形式把各個數據展示出來,這個項目是我們一個經理的重點關照項目。把平臺模塊部署完畢並且啟動之後,又把這個平臺服務器的外網IP綁定到alkaid.lechange.com這個域名上,在瀏覽器裏輸入https://al

記錄concurrent mode failure問題排查過程以及解決思路

tails only cnblogs 策略 executor red execute incr run 背景:後臺定時任務腳本每天淩晨5點30會執行一個批量掃庫做業務的邏輯。 gc錯誤日誌: 2017-07-05T05:30:54.408+0800: 518534

記錄MySQL進程崩潰,無法重啟故障排查

not pool function 解決 variables fail data class 緩沖 最近程序在跑著沒幾天,突然訪問不了,查看應用進程都還在。只有數據庫的進程down掉了。於是找到日誌文件看到如下錯誤 2017-07-24 01:58:53 19934 [N

記錄處理https監聽不正確的過程

負載均衡 https 502 nginx 金山雲 今天開發反饋在測試金山雲設備的時候遇到了這樣的一個現象:wget https://funchlscdn.lechange.cn/LCLR/2K02135PAK01979/0/0/20170726085033/dev_201707260850

記錄基於LV塊做存儲介質的KVM擴容過程

kvm擴容 基於lv的kvm擴容 kvm硬盤擴容 從下圖可看出盤已經不夠用了然後到宿主機執行LVM擴展Lv 擴充過程略然後擴容完,在虛擬機上執行fdils –l在宿主機擴容的LV在虛擬機裏已經有容量顯示,但我們的分區仍然沒有被顯示出來還是原來的310G因為這個分區在分時考慮到後期的擴充,所以用了G

記錄服務器被攻擊

服務器 攻擊 肉雞 公司一臺服務器從某一個時間開始,突然在每天不定期出現磁盤io和進程數的告警,初期進行查看,並未發現問題,暫時擱置。 每次告警時間都很短暫,所以很難在系統出現告警時登錄查看。而且由於在忙其他事情,這件事也一直沒有仔細去查。 登錄檢查的時候發現有一個分區磁盤滿了

記錄https證書申請失敗的案例

hydra tor 一次 申請 目錄 tin site text auto 部分站點由於使用了大量的域名,會導致 auto-ssl 配置的內存不夠用,導致證書申請失敗。需要做以下調整 nginx.conf 中 lua_shared_dict auto_ssl 調整為 128

記錄mysql 5.7 max_allowed_packet修改失敗的問題

packet for query is too large (2010 > 1024) mysql 5.7 max_allowed_packet今天我的客戶給我反饋說報錯 ### Error querying database. Cause: com.mysql.jdbc.PacketTooBigEx

記錄mariadb啟動錯誤

mariadb機器無意重啟了,之後啟動一直顯示在Start Mysql.....查看mysql日誌錯誤如下第一個ERROR解決方法: 修改/data/mydata權限,chomd 777 /data/mydata再次重啟故障未解決,查看日誌報錯如下根據網上查找的解決方案為初始化mysql 運行/u

記錄經歷的數據庫從單庫到分庫分表的過程

人力 per 靠譜 img center 沒有 tdd 推出 數據 前言 目前所在的的項目組,由於項目正在處於一個業務爆發期,每天數據的增長量已經給我們數據庫乃至系統造成了很多不確定的因數,前期依靠優化業務和SQL等方式暫時還能夠支撐住。但是最近發現某些表數據達到50

記錄cacti中文亂碼解決經過

cacti中文支持 cacti中文亂碼 背景:公司一臺老機器,上面有個cacti。系統為centos5.X,有天手滑卸載了httpd,但yum源已經不支持centos5系列了,無奈百度上找了一個源內容如下:<span style="background-color: rgb(255, 102,