成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JavaScript 數(shù)組分組的實現(xiàn)

Coly / 1955人閱讀

摘要:今天回答了的問題生產(chǎn)嵌套數(shù)組也就是對數(shù)組分組更好的寫法。實現(xiàn)像這種,目標數(shù)組長度和原數(shù)組長度不一致的情況,函數(shù)式寫法很容易想到函數(shù)。小結(jié)數(shù)組分組是一個很簡單的問題,有很多種方法來處理。

今天回答了 @_bleach 的問題:JS生產(chǎn)嵌套數(shù)組(也就是對數(shù)組分組)更好的寫法?;卮鸬倪^程中對 lodash _.chunk() 產(chǎn)生了好奇,所以分析了一下它的源碼,再加上我自己的解決方案,收集了如下一些方案,分享給大家

按慣例,我還是使用 es6 語法,在 Node7 中實驗通過

數(shù)據(jù)和參數(shù)和期望結(jié)果
const data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
const groupByNum = 3;

RxJS

因為最近在學習 RxJs,所以順手做了個 RxJs 解決方案。但這不是重點。不了解或者很了解 RxJs 的請忽略。

RxJava 很火,其實 ReactiveX 有很多種語言的實現(xiàn),JavaScript 的實例就是 RxJs,建議學習的同學直接上 5.0 Beta。不過 RxJs 主要用于異步流處理,所以需要通過回調(diào)函數(shù)來使用結(jié)果。

const Rx = require("rxjs");
const out = Rx.Observable.from(data)
    .bufferCount(groupByNum)
    .toArray()
    .do((result) => {
        console.log(result)
    })
    .subscribe();

上面的 do() 一句可以直接寫成 do(console.log),寫成現(xiàn)在這樣的目的是為了讓大家看到計算結(jié)果在哪。

_.chunk() 實現(xiàn)

lodash 提供了大量數(shù)據(jù)處理的方法,_.chunk() 專為分組而生

const _ = require("lodash");
const result = _.chunk(data, groupByNum);
_.chunk() 的源碼

在 node 環(huán)境也,通過 npm 安裝 lodash 之后就能在 node_modules/lodash 目錄下找到源碼文件 chunk.js

npm install lodash

所以完整的源碼不貼了,只看下關(guān)鍵的那一句

  while (index < length) {
    result[resIndex++] = baseSlice(array, index, (index += size));
  }

baseSlice() 是 lodash 對 Array.prototype.slice() 的兼容性實現(xiàn),可以直接當 slice() 來看??戳诉@個源碼,我有了函數(shù)式寫法的思路,后面通過 slice() + map() 實現(xiàn)部分詳述。

reduce() 實現(xiàn)

像這種,目標數(shù)組長度和原數(shù)組長度不一致的情況,函數(shù)式寫法很容易想到 reduce() 函數(shù)。只可惜單純的 reduce() 做不出來(在 data.length 不能被 groupByNum 整除的時候)

function groupArray(data, cols) {
    const r = data.reduce((r, t) => {
        r.current.push(t);
        if (r.current.length === cols) {
            r.list.push(r.current);
            r.current = [];
        }
        return r;
    }, { list: [], current: [] });

    if (r.current.length) {
        r.list.push(r.current);
    }

    return r.list;
}

const result = groupArray(data, groupByNum);

reduce() 的初始化對象是 { list: [], current: [] },其中 list 是要得計算出來的結(jié)果,而 current 是中間變量,用于生成每個組。

最后由于不有保證 data.length 一定被 groupByNum 整除,所以可能會有一個未完成的 current 沒被 push 到 list 當中,所以專門進行了一個判斷和處理。因此不能寫成函數(shù)式寫法,有些遺憾。

forEach() 實現(xiàn)

既然不能用函數(shù)式寫法,那 forEach() 或者 for ... of 實現(xiàn)就會更容易理解一些。

function groupArray(data, cols) {
    const list = [];
    let current = [];

    // for (t of data) {
    data.forEach(t => {
        current.push(t);
        if (current.length === cols) {
            list.push(current);
            current = [];
        }
    });
    // }    // for (t of data)

    if (current.length) {
        list.push(current);
    }
    return list;
}
slice() + map() 實現(xiàn)

看到了 _.chunk() 的源碼,讓我產(chǎn)生了函數(shù)式寫法的靈感,相比上面的解決方案,更難于理解,不過語法看起來很酷

const result = Array.apply(null, {
    length: Math.ceil(data.length / groupByNum)
}).map((x, i) => {
    return data.slice(i * groupByNum, (i + 1) * groupByNum);
});

Array.apply() 是為了生成一個長度為 Math.ceil(data.length / groupByNum) 的數(shù)組作為 map() 的源,map() 不需要這個源的數(shù)據(jù),只需要這個源每個數(shù)組的 index。

Math.ceil() 用于保證在除法計算有余數(shù)的時候?qū)ι?+1,即循環(huán)次數(shù) +1。

然后在算得的循環(huán)次數(shù)中,通過 slice 返回每一段結(jié)果,通過 map() 映射出來,最終生成需要的結(jié)果。

小結(jié)

數(shù)組分組是一個很簡單的問題,有很多種方法來處理。本文并不是想告訴大家如何處理這個問題,而是將我處理問題的思路分享出來,希望能對處理各種數(shù)據(jù)問題帶來一點點啟發(fā)。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/80868.html

相關(guān)文章

  • JavaScript 實現(xiàn)數(shù)組更多高階函數(shù)

    摘要:實現(xiàn)數(shù)組更多的高階函數(shù)吾輩的博客原文場景雖說人人平等,但有些人更加平等。若是有一篇適合萌新閱讀的自己實現(xiàn)數(shù)組更多操作的文章,情況或許會發(fā)生一些變化。類似于的初始值,但它是一個函數(shù),避免初始值在所有分組中進行累加。 JavaScript 實現(xiàn)數(shù)組更多的高階函數(shù) 吾輩的博客原文: https://blog.rxliuli.com/p/fc... 場景 雖說人人平等,但有些人更加平等。 為...

    aervon 評論0 收藏0
  • JavaScript那些坑

    摘要:序列化為字符串之后它的各個屬性已經(jīng)被解除了引用,重新相當于創(chuàng)建了一個新的對象。類似于的,的命令行終端?;舅悸泛瘮?shù)的使用以及協(xié)議。 多行注釋的陷阱 由于正則表達式字面量的存在,多行注釋可能會產(chǎn)生陷阱,例如以下程序?qū)伋鲥e誤: /* var a = /h*/.test(hello); */ 正則結(jié)束前的那個星號將被解析為注釋結(jié)束符,從而.被認為是不合法的.所以盡量避免使用多行注釋 整型 ...

    ivyzhang 評論0 收藏0
  • 排序算法Javascript實現(xiàn)

    摘要:排序加了的插入排序。分別以索引數(shù)為的元素為起點,將其看做不同的組,,,為一組,,為一組依次分組,按照組為單位進行插入排序。各組都已經(jīng)插入排序一輪過后,將除以向下取整,再進行分組并將各組分別進行插入排序,直到為。 1.冒泡排序: 比較相鄰的兩個數(shù),如果前一個數(shù)大于后一個數(shù),就將這兩個數(shù)換位置。每一次遍歷都會將本次遍歷最大的數(shù)冒泡到最后。為了將n個數(shù)排好序,需要n-1次遍歷。 如果某次遍歷...

    fredshare 評論0 收藏0
  • javascript 正則命名分組

    摘要:早已實現(xiàn)了正則命名分組提案,只是我們很少使用,本文將介紹的正則命名分組。所有這些問題,都可以通過正則命名分組來解決。該名稱必須是合法的標識符。 前言 以往我們只是習慣于通過數(shù)組下標來訪問正則匹配到的分組,但分組達到4、5個時,標識起來就會非常麻煩。V8早已實現(xiàn)了正則命名分組提案,只是我們很少使用,本文將介紹JS的正則命名分組。 以往的做法 假設要使用正則匹配一個日期的年月日,以往我們會...

    Galence 評論0 收藏0
  • 玩轉(zhuǎn)javascript RegExp對象

    摘要:玩轉(zhuǎn)對象中的正則表達式的正則表達式語法極大地借鑒了另一種腳本語言的正則表達式語法對象是的一個內(nèi)置對象,與,類似。創(chuàng)建對象可通過構(gòu)造函數(shù)創(chuàng)建。當要根據(jù)用戶輸入來構(gòu)造正則表達式時,必須采用構(gòu)造函數(shù)方式。如與被看做相同的字符模式。 玩轉(zhuǎn)javascript RegExp對象 js中的正則表達式 js的正則表達式語法極大地借鑒了另一種腳本語言Perl的正則表達式語法.RegExp對象是js的一...

    alexnevsky 評論0 收藏0

發(fā)表評論

0條評論

Coly

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<