框架提供了字符串模板,方便數據渲染
有兩種數據渲染方式
1.使用 _.template(tplStr,data),相關代碼以下javascript
<script type="text/template" id="tpl"> <% _.each(data, function(n){ %> <p>姓名:<%= n.name %></p> <% }); %> </script> let data = [ {name : '阿里巴巴'}, {name : '百度'} ]; _.template($('#tpl').html(), data ); // 直接使用 data 做爲模板數據
2.使用_.template( tplStr ),相關代碼以下css
<script type="text/template" id="tpl"> <% _.each(data, function(n){ %> <p>姓名:<%= n.name %></p> <% }); %> </script> // 注意 data 數據的區別 let data = {data :[ {name : '阿里巴巴'}, {name : '百度'} ]}; let comp = _.template( $('#tpl').html() ); // 預編譯 $('body').append( comp (data) ); // 渲染數據
兩種方式的主要區別在於,數據對象在模板中的取值,第一種方式傳什麼就處理什麼數據,傳過來數據就是數據源。第二種是數據的鍵做爲數據源。注意區別,若是使用模塊化,能夠不用在 html 文件中使用 script, 能夠將模板做爲一個獨立的js文件,方便複用html
集合,顧名思義處理數據集合的方法,在javascript中,集合主要指數組和對象,固然在es6中,涉及到Set 和 Map 數據結構。關於 set 和 map 的數據結構的集合不在討論範圍。請查閱相關資料。在使用集合方法的時候,爲了便於理解,把數組理解成特殊的對象,數組的索引是對象的鍵,數組的元素是對應的鍵值。html5
_.each({one: '阿里巴巴', two: '騰訊', three: '百度'},function(value,key){ console.log(value); // 阿里巴巴 騰訊 百度 }); // 注意回調函數中的,對於對象來講 value 表示是值,key表示的是鍵。
_.map([1, 2, 3], function(num){ return num * 3 }); // [3,6,9] _.map({one: 1, two: 2, three: 3}, function(num, key){ return num * 3; }); // [3,6,9]
/****************************** 累加 ***************************/ var result = _.reduce([1,2,3,4,5],function(v1,v2){ return v1 + v2; // v1,表示每次迭代後的結果,v2,表示當前對象 },10); // 參數10, 表示迭代的起始值。不傳,默認是集合的第一個元素 console.log( result ); // 25 /*************************** 合併數組 ***************************/ var result = _.reduce([[1,2],[3,4],5,6,[[7,8]]],function(v1,v2){ return v1.concat( v2 ); }); console.log( result ); // [1,2,3,4,5,6,[7,8]]
功能與reduce相似,別名: foldr,不一樣的是,該方法從後向前迭代,其餘並沒有區別,用法參考reduce,須要說明的是,在es5提供了一樣的方法,方法名與功能相同,能夠直接使用。java
var even = _.find([ 1, 3, 4, 5, 6 , 2 ], function( num ){ return num % 2 == 0; }); console.log(even); // 4 var result = _.find([ 'a','bb','cc','dd' ], function( str ){ return str.length == 2; });
var evens = _.filter([1, 2, 3, 4, 5, 6], function(num){ return num % 2 == 0; }); console.log( evens ) ; // [2,4,6]
var result = _.where([ {title: "The Tempest", author: "Shakespeare", year: 1611}, {title: "The Tempest", year: 44}, {title: "The Tempest", author: "Shakespeare", year: 50}, {year: 44}],{year:44}); console.log( result ); // [{title: "The Tempest", year: 44},{year: 44}]
var result = _.findWhere([ {title: "The Tempest", year: 1611}, {title: "The Tempest", year: 44}, {author: "Shakespeare", year: 1611,'csss':'css'}],{year: 1611}); console.log( result ); // {title: "The Tempest", year: 1611}
var result = _.reject([1, 2, 3, 4, 5, 6], function( item ){ return item % 2 == 0; }); console.log( result ); // [1,3,5]
var result = _.every([true, 1, null, 'yes']); console.log( result ); // false
var result = _.some([null, 0, 'yes', false]); console.log( result ); // true
var result = _.contains([1, 2, 3], 3); console.log( result ); // true var result = _.contains( {'name':123,'age':'age',sex:'男'}, '男' ); console.log( result ); // true
var result = _.invoke([[5, 1, 7], [3, 2, 1]], 'sort'); // 排序 console.log( result ); // [ [1, 5, 7], [1, 2, 3] ] var result = _.invoke([[5, 1, 7], [3, 2, 1]], 'reverse'); // 倒置 console.log( result ); // [[7, 1, 5], [1, 2, 3]] // 自定義方法 arguments 表示方法的參數 var result = _.invoke( [ 1, 2, 3, 4, 5 ], 'toFixed', 2 ); // 保留2位小數 console.log(result); // ["1.00", "2.00", "3.00", "4.00", "5.00"] // 自定義方法 this 表示當前元素 var result = _.invoke( [ 1, 2, 3, 4, 5 ], function(){ return this + 10; }); console.log( result ); // [11, 12, 13, 14, 15] // 自定義方法傳參 var result = _.invoke( [ 1, 2, 3, 4, 5 ], function( a ){ return this * a; },10); console.log( result ); // [10, 20, 30, 40, 50]
var result = _.pluck( [ {name: 'moe', age: 40 }, {name: 'larry', age: 50}, {name: 'curly',age: 60} ], 'name'); console.log( result ); // ["moe", "larry", "curly"]
var result = _.max( [ {name: 'moe', age: 40}, {name: 'larry', age: 50}, {name: 'curly', age: 60} ], function( item ){ return item.age; }); console.log( result ); // {name: "curly", age: 60}
var result = _.min( [10, 5, 100, 2, 1000], function( a, b ){ console.log(a,b); // a 值,b 索引 }); console.log( result ); // 2
var result = _.sortBy([1, 2, 3, 4, 5, 6], function( item ){ return Math.sin( item ); // 按sin值得大小對元素排列 }); console.log( result ); // [5, 4, 6, 3, 1, 2] var result = _.sortBy(['alibaba','xiaomi','tengxu','baidu','cctv'],function( item ){ return item.length; // 按字符串長度排序 }); console.log(result); // ["cctv", "baidu", "xiaomi", "tengxu", "alibaba"] var result = _.sortBy([ {'age':30}, {'age':8,'name':'百度'}, {'age':50,'name':'阿里'} ], function( item ){ return item.age; }); console.log(result) // [{'age':8,'name':'百度'},{'age':30},{'age':50,'name':'阿里'}] var result = _.sortBy([ 5, 0, 2, -1, -3, 4, -17, 6], function( item ){ return Math.abs( num ); // 按絕對值 的大小 排列數據 }); console.log( result ); // [0, -1, 2, -3, 4, 5, 6, -17]
var result = _.groupBy([1.3, 2.1, 2.4, 8.3], function( item ){ return Math.floor( item ); }); console.log( result,123 ); // { 1:[ 1.3 ], 2:[ 2.1, 2.4 ] } // 使用屬性,做爲條件 var result = _.groupBy(['one', 'two', 'three'], 'length'); console.log( result ); // { 2:[ "one", "two" ], 5:[ "three" ] } // 使用函數,做爲條件 var result = _.groupBy(['one', 'two', 'three'], function( value, key ){ return value.length; }); console.log( result ); // { 2:[ "one", "two" ], 5:[ "three" ] }
//以鍵名爲條件 var result = _.indexBy([ { name: 'moe', age: 40 }, { name: 'larry', age: 50 }, { name: 'curly', age: 60}, ],'age'); console.log( result ); //{ 40 : { name : "moe", age : 40}, 50 : { name : "larry", age : 50 }, 60 : { name : "curly", age : 60 } } // 以函數爲條件 var result = _.indexBy([ { name: 'moe', age: 40 }, { name: 'larry', age: 50 }, { name: 'curly', age: 60}, ],function( item, key ){ return item.age; }); console.log( result ); //' {40 : { name : "moe", age : 40}, 50 : { name : "larry", age : 50 }, 60 : { name : "curly", age : 60 } }
var result = _.countBy([1, 2, 3, 4, 5], function( item ) { return item % 2 == 0 ? 'even': 'odd'; // 計算奇數偶數的個數,並以指定的鍵值返回 }); console.log( result ); // { odd : 3, even : 2 }
var result = _.shuffle([1, 2, 3, 4, 5, 6]); console.log( result ); // 重新組合的數組
var result = _.sample([1, 2, 3, 4, 5, 6]); console.log( result );
var result = (function(){ return _.toArray(arguments).slice(1); })(1, 2, 3, 4); console.log( result ); // [2, 3, 4]
var result = _.size( { one: 1, two: 2, three: 3} ); console.log( result ); // 3
var result = _.partition([0, 1, 2, 3, 4, 5], function( item ){ return item % 2 == 0; }); console.log( result ); // [[0, 2, 4],[1, 3, 5]]
var result = _.first([5, 4, 3, 2, 1]); console.log( result ); // 5 var result = _.first([5, 4, 3, 2, 1],3); console.log( result ); // [5, 4, 3] var result = _.first([{name:'name'},{age:'age'},{sex:'sex'}]); console.log( result ); // { name:'name' }
var result = _.initial([5, 4, 3, 2, 1]); console.log( result ); // [5, 4, 3, 2] var result = _.initial([5, 4, 3, 2, 1],3); console.log( result ); // [5, 4]
var result = _.last([5, 4, 3, 2, 1]); console.log( result ); // 1 var result = _.last([5, 4, 3, 2, 1],2); console.log( result ); // [2,1]
var result = _.rest( [5, 4, 3, 2, 1] ); console.log( result ); // [4, 3, 2, 1] var result = _.rest( [5, 4, 3, 2, 1], 3 ); console.log( result ); // [2, 1]
var result = _.compact( [0, 1, false, 2, '', 3, 'xyz', undefined, null ] ); console.log( result ); // [1, 2, 3, "xyz"]
var result = _.flatten([1, [2], [3, [[4]]]]); console.log( result ); // [1, 2, 3, 4] var result = _.flatten([1, [2], [3, [[4]]]],true); console.log( result ); //' [1,2,3,[[4]]]
var result = _.without([1, 2, 1, 0, 3, 1, 4], 0, 1); console.log( result ); // [2,3,4]
var result = _.union([1, 2, 3], [101, 2, 1, 10], [2, 1]); console.log( result ); // [1, 2, 3, 101, 10]
var result = _.intersection([1, 2, 3], [101, 2, 1, 10], [2, 1]); console.log( result ); // [1,2]
var result = _.difference( [1, 2, 3, 4, 5], [5, 2, 10], [1] ); console.log( result ); // [3,4]
var result = _.uniq([1, 2, 1, 3, 1, 4]); console.log( result ); // var result = _.uniq([{name:1},{name:2},{name:3},{name:4},{name:3},{name:2}],function( key, value ){ return key.name; }); console.log( result ); // [{name:1},{name:2},{name:3},{name:4}]
var result = _.zip(["moe", "larry", "curly"], [30, 40, 50], [true, false,false]); console.log( result ); // [["moe", 30, true], ["larry", 40, false], ["curly", 50, false]]
var result = _.object(['moe', 'larry', 'curly'], [30, 40, 50]); console.log( result ); // { moe : 30, larry : 40, curly : 50 } var result = _.object([ [ 'xxxx', 30 ], [ 'yyyy', 40 ], [ 'zzzz', 50 ] ]); console.log( result ); // {xxxx: 30, yyyy: 40, zzzz: 50}
var result = _.indexOf([1, 2, 3], 2); console.log( result ); // 1
var result = _.lastIndexOf([1, 2, 3, 1, 2, 3], 1); console.log( result ); // 3 var result = _.lastIndexOf([1, 2, 3, 1, 2, 3], 2, 4); console.log( result ); // 4
var arr = [10, 20, 30, 40, 50]; var result = _.sortedIndex( arr, 35); arr.splice(result,0,35); console.log( arr ); // [10, 20, 30, 35, 40, 50] var result = _.sortedIndex([ {name: 'moe', age: 40}, {name: 'curly', age: 60} ], {name: 'larry', age: 50}, 'age'); console.log( result ); // 1
var result = _.findIndex([4, 6, 8, 12], 12); console.log(result);
var result = _.range( 0, -10, -1 ); console.log( result ); // [0, -1, -2, -3, -4, -5, -6, -7, -8, -9] var result = _.range(10); console.log( result ); // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] var result = _.range(0,10,2); console.log( result ); // [0, 2, 4, 6, 8]
*arguments,參數列表,函數參數列表,即參數function的列表jquery
var func = function(greeting){ return greeting + ":" + this.name }; var func = _.bind(func, {"name": "moe"}, "hi"); console.log( func() ); // hi: moe
var buttonView = { label : 'underscore', onClick: function(){ alert( 'clicked: ' + this.label ); }, onHover: function(){ console.log('hovering: ' + this.label ); } }; _.bindAll(buttonView, 'onClick', 'onHover'); $('button').click(buttonView.onClick); // 使 this 始終指向被綁定的對象,避免this指針指向當前對象
var add = function(a, b, c ) { return a / b + c; }; add5 = _.partial(add, 5); add10 = _.partial(add5, 10); console.log( add10( 2 ) ); // 2.5
var fibonacci = _.memoize(function(n) { return n < 2 ? n : fibonacci( n - 1 ) + fibonacci( n - 2 ); }); var result = fibonacci( 10 ); console.log( result ); // 55 // 能夠經過下面的方式獲取已經計算過的值 console.log( fibonacci( 9 ) ); // 34 console.log( fibonacci.cache[9] ); // 34
var log = _.bind(console.log, console); // 固定 this 指針指向 var result = _.delay(log, 1000, "logged later"); // 1s以後打印 logged later console.log( result ); // 返回定時器id
_.defer(function(a,b){ console.log(a,b,a); // 10 undefined 10 },"10");
參數:function,執行頻繁的函數;wait,下一次執行的時間;options,對象,可選。
若是你想禁用第一次首先執行的話,傳遞{leading: false},還有若是你想禁用最後一次執行的話,傳遞{trailing: false}。es6
var throttled = _.throttle(function(a,b){}, 100); $(window).scroll(throttled); // 滾動事件觸發頻繁,節流提升性能
var lazyLayout = _.debounce(function(){ console.log(123); }, 3000); $('input').click(lazyLayout); // 每次都會在三秒以後調用該函數,防止重複執行
function lg( a, b ){ return a + b; }; var initialize = _.once( lg ); console.log( initialize(1,2) ); // 3
在處理同組異步請求返回結果時, 若是你要確保同組裏全部異步請求完成以後才 執行這個函數, 這將很是有用。算法
var renderNotes = _.after(3, function(){ // 在執行三次以後,執行回調函數 }); _.each(notes, function(note) { note.asyncSave({success: renderNotes}); });
var monthlyMeeting = _.before(3, function( a, b ){ return a + b; }); console.log( monthlyMeeting( 10, 20 ) ); // 30 console.log( monthlyMeeting( 10, 40 ) ); // 50 console.log( monthlyMeeting( 10, 40 ) ); // 50 console.log( monthlyMeeting( 10, 40 ) ); // 50
控制已知函數的執行順序數組
var hello = function( name ) { return "hello: " + name; }; hello = _.wrap( hello, function( func ) { // 函數重載 return "before, " + func( "moe" ) + ", after"; }); console.log( hello() ); // before, hello: moe, after
var isFalsy = _.negate(Number); var result = _.find( [-2, 'true', null, 0, 1, 2], isFalsy ); console.log( result ); // null
var greet = function(name){ return "hi: " + name; }; var exclaim = function(statement){ return statement.toUpperCase() + "!"; }; var test = function( a ){ return ' ' + a + ' tttt'; }; console.log(_.compose(greet,exclaim,test)('alibaba')); // hi: ALIBABA TTTT!