1. 程式人生 > >根據underscore精簡的函式(陣列篇)

根據underscore精簡的函式(陣列篇)

這裡將underscore.js內的函式進行精簡,指在幫助理解或者快速回憶起underscore.js的原理,更深入的瞭解函數語言程式設計。

這裡將精簡underscore中提供的針對陣列的操作,部分API已經在《根據underscore精簡的函式(集合篇)》中體現,不再贅述。

_.initial

var initial = function (array, n) {
    return Array.prototype.slice.call(array, 0, Math.max(0, array.length - (n == null ? 1 : n)));
};
var
a =initial([5, 4, 3, 2, 1],2); console.log(a);

執行結果

[ 5, 4, 3 ]

_.rest

var rest=function(arr,n){
    return Array.prototype.slice.call(arr,n==null?1:n);
};
var a =rest([5, 4, 3, 2, 1],2);

console.log(a);

執行結果

[ 3, 2, 1 ]

_.first

var first=function(arr,n){
    if(arr==null||arr.length<1
) return void 0; if(n==null) return arr[0]; return initial(arr,arr.length-n); }; var a =first([5, 4, 3, 2, 1],2); console.log(a);

執行結果

[ 5, 4 ]

_.flatten

var isArray=function(obj){
    return Object.prototype.toString.call(obj)==='[object Array]';
};

var flatte=function(input,shallow,strict,startIndex)
{
var output=[],idx=0; for(var i=startIndex||0,length=input.length;i<length;i++){ var value=input[i]; if (isArray(value)){ if(!shallow) value=flatte(value,shallow,strict); var j=0,len=value.length; output.length+=len; while(j<len){ output[idx++]=value[j++]; } }else if(!strict){ output[idx++]=value; } } return output; }; var flatten = function (array, shallow) { return flatte(array, shallow, false); }; var a =flatten([1, [2], [3, [[4]]]]); var b =flatten([1, [2], [3, [[4]]]],true); console.log(a); console.log(b);

執行結果

[ 1, 2, 3, 4 ]
[ 1, 2, 3, [ [ 4 ] ] ]

_.uniq

var uniq=function(arr,isSorted){
    var result=[],seen=[];
    for(var i=0,length=arr.length;i<length;i++){
        var value=arr[i],
            computed=value;
        if(isSorted){
            if(!i||seen!==computed) result.push(value);
            seen=computed;
        }else if(result.indexOf(value)==-1){
            result.push(value);
        }
    }
    return result;
};
var a=uniq([1,1,1,1,2,2,2,3,3]);

console.log(a);

執行結果

[ 1, 2, 3 ]

_.intersection

var intersection=function(array){
    var result=[];
    var argsLength=arguments.length;
    for(var i=0,length=array.length;i<length;i++){
        var item=array[i];
        if (!(result.indexOf(item)==-1)) continue;
        for(var j=1;j<argsLength;j++){
            if(arguments[j].indexOf(item)==-1) break;
        }
        if(j===argsLength) result.push(item);
    }
    return result;
};
var a=intersection([1, 2, 3], [101, 2, 1, 10], [2, 1]);

console.log(a);

執行結果

[ 1, 2 ]

_.difference

var difference = function(array) {
    var rest = flatte(arguments, true, true, 1);
    return filter(array, function(value){
        return (rest.indexOf(value)==-1);
    });
};

var a=difference([1, 2, 3, 4, 5], [5, 2, 10]);
console.log(a);

執行結果

[ 1, 3, 4 ]

_.unzip

var unzip=function(array){
    var length=array.length;
    var result=Array(length);
    for(var index=0;index<length;index++){
        result[index]=_.pluck(array,index);
    }
    return result;
};
var names = ['moe', 'larry', 'curly'];
var ages = [18, 23, 30];
var sexes = ['male', 'female', 'male'];
var students = unzip([names, ages, sexes]);

console.log(students);

執行結果

[ [ 'moe', 18, 'male' ],
  [ 'larry', 23, 'female' ],
  [ 'curly', 30, 'male' ] ]

_.compact

var compact=function(array){
    return filter(array,Boolean);
};
var a=compact([0, 1, false, 2, '', 3]);

console.log(a);

執行結果

[ 1, 2, 3 ]

_.object

var object=function(list,values){
    var result={};
    for (var i=0,length=list.length;i<length;i++){
        if(values){
            result[list[i]]=values[i];
        }else{
            result[list[i][0]]=list[i][1];
        }
    }
    return result;
};

var a=object(['moe', 'larry', 'curly'], [30, 40, 50]);
var b=object([['moe', 30], ['larry', 40], ['curly', 50]]);
console.log(a);
console.log(b);

執行結果

{ moe: 30, larry: 40, curly: 50 }
{ moe: 30, larry: 40, curly: 50 }

_.range

var range=function(start,stop,step){
    if(stop==null){
        stop=start||0;
        start=0;
    }
    if(!step){
        step=stop<start?-1:1;
    }
    var length=Math.max(Math.ceil((stop-start)/step),0);
    var range=Array(length);
    for(var idx=0;idx<length;idx++,start+=step){
        range[idx]=start;
    }
    return range;
};
var a=range(0,30,5);
console.log(a);

執行結果

[ 0, 5, 10, 15, 20, 25 ]

_.chunk

var chunk=function(arr,count){
    if(count==null||count<1) return [];
    var result=[];
    var i=0,length=arr.length;
    while(i<length){
        result.push(Array.prototype.slice.call(arr,i,i+=count));
    }
    return result;
};

var a=chunk([1,2,3,4,5,6,7], 2);
console.log(a);

執行結果

[ [ 1, 2 ], [ 3, 4 ], [ 5, 6 ], [ 7 ] ]

相關推薦

根據underscore精簡函式陣列

這裡將underscore.js內的函式進行精簡,指在幫助理解或者快速回憶起underscore.js的原理,更深入的瞭解函數語言程式設計。 這裡將精簡underscore中提供的針對陣列的操作,部分API已經在《根據underscore精簡的函式

20.方差/標準差/數學期望/正態分佈/高斯函式數學--- OpenCV從零開始到影象人臉 + 物體識別系列

本文作者:小嗷 微信公眾號:aoxiaoji 吹比QQ群:736854977 本文你會找到以下問題的答案: 方差 標準差 數學期望 正態分佈 高斯函式 2.1 方差 方差描述隨機變數對於數學期望的偏離程度。(隨機變數可以

常用演算法題目總結一陣列

如何用遞迴實現陣列求和? 程式碼如下: #include "stdafx.h" #include<iostream> #include<string> using namespace std; template<class

C++子類物件隱藏了父類的同名成員函式隱藏

#include <iostream>#include <stdlib.h>#include <string>using namespace std;/** * 定義人類: Person * 資料成員: m_strName * 成員函式:

Lodash陣列

Lodash chunk _.chunk ( arr ,num ) 從前往後按num切割arr _.chunk(['a', 'b', 'c', 'd'],

用JAVA實現堆疊陣列

什麼是堆疊,關於這個名詞,我在百度,google搜尋了半天,也沒有發現一個比較權威的解釋,還有許多資料語焉不詳,就以維基百科的解釋為準吧,和我記憶中的一致。 堆疊(英文:stack),中國大陸作堆疊,臺灣作堆疊,在電腦科學中,是一種特殊的串列形式的資料結構,它的特殊之處在於只

詳解遞迴基礎———函式棧、階乘、Fibonacci數列

一、遞迴的基本概念 遞迴函式:在定義的時候,自己呼叫了自己的函式。 注意:遞迴函式定義的時候一定要明確結束這個函式的條件! 二、函式棧 棧:一種資料結構,它僅允許棧頂進,棧頂出,先進後出,後進先出。我們可以簡單的理解為棧就是一個杯子,這個杯子裡面有很多隔層,每一層都可以放東西,第一個放入的東西就在杯子

VLOOKUP函式的使用方法初級

VLOOKUP函式的使用方法(初級篇) 2016年12月21日 13:32:58 chengfans 閱讀數:1665 標籤: Excel函式 更多 個人分類: Excel相關 上一講咱們學習了VLOOKUP的基本用法和示例,本

“全棧2019”Java第二十八章:陣列詳解

難度 初級 學習時間 10分鐘 適合人群 零基礎 開發語言 Java 開發環境 JDK v11 IntelliJ IDEA v2018.3 文章原文連結 “全棧2019”Java第二十八章:陣列詳解(上篇) 下一章 “全棧2019”Java第二十九章:陣列詳解(中篇)

WebAssembly陣列傳遞輸入

接著輸出篇,接下來就講輸入的操作 *注意:在使用emscripten::val和emscripten::bind時,編譯時要帶上--bind引數 傳統法: JS: var ptr = Module._malloc(myTypedArray.length * myTyp

磁碟陣列Raid0,Raid1,Raid10,Raid5的建立Raid1

Raid1 和Raid0一樣,先建立兩個磁碟並進行分割槽 fdisk /dev/sdd fdisk /dev/sde [[email protected] ~]# fdisk /dev/sdd Device contains neither

WebAssembly 陣列傳遞輸出

最近有一個專案需要以原生方式輸出js陣列,這裡分類一些方法: 公共頭部: #include <emscripten/val.h> #include <emscripten/bind.h> using namespace emscripten;

c++ LeetCode陣列簡單級別演算法例題程式碼詳解

  原文作者:aircraft 原文連結:https://www.cnblogs.com/DOMLX/p/10940636.html         唉!最近忙著面試找實習,然後都是面試的很多是leetcode的演算法題,所以自己就刷了一遍,並且做些筆記,以後再來複習好了,悲催的

DAX 第六:統計函式描述性統計

統計函式用於建立聚合,對資料進行統計分析。在使用統計函式時,必須考慮到資料模型,表之間關係,資料重複等因素,一般都會搭配過濾函式實現資料的提取和分析。 統計量一般是:均值、求和、計數、最大值、最小值、求中位數、獲得分位數等。 一,求均值 均值分為幾何均值和算術均值,幾何平均數是n個變數值連乘積的n次方根

進階之路基礎 - 011 arduino api基礎手冊

異或 change 可用 算術運算符 chan 程序結構 換算 是否 關閉 arduino 函數 api 程序結構 在Arduino中, 標準的程序入口main函數在內部被定義, 用戶只需要關心以下兩個函數:void setup()void loop()setup() 函數

進階之路基礎 - 008 SPI數據傳輸(庫函數方法)

ria att clockd == bus 屏蔽 attach serial out 主機端: 1 /********************************* 2 代碼功能:SPI數據傳輸(主機端) 3 引腳說明: 4 SS/CS:片選(高電平屏

進階之路基礎 - 009 通過底層AVR方法實現SPI數據傳輸

lean oop and return false 進階 from setup pie 主機端: /********************************* 代碼功能:通過底層AVR方法實現SPI數據傳輸(主機端) 創作時間:2016*10*17 使用資源:

進階之路基礎 - 007 脈沖寬度測量

style 函數 long 最大 void serial 作者 println 電平 1 /********************************* 2 代碼功能:Pulse脈沖寬度測量 3 使用函數: 4 pulseIn(引腳號,脈沖響應電平,

進階之路中級 - 018 基於arduino的簡易版智能衣架

檢驗 dig cloc 布線 pin on() -- mage 根據 一. 設備及要求 目的:制作一個可以自動根據事實的天氣的狀況進行對衣架上的衣服進行晾曬。 基礎裝置:可伸縮的晾衣架。 開發環境:Arduino1. 8.1 主控板:Arduino UNO 動力裝置:

【MyBatis源碼分析】insert方法、update方法、delete方法處理流程

times database connect 環境 enable clas 它的 java對象 ace 打開一個會話Session 前文分析了MyBatis將配置文件轉換為Java對象的流程,本文開始分析一下insert方法、update方法、delete方法處理的流程,至