写一个& map方法 - 使用object.prototype.toString进行数组/对象迭代

时间:2016-01-21 19:12:19

标签: functional-programming underscore.js lodash higher-order-functions

试图重写each()& map()

这应该与原生forEach或下划线或lodash _.each方法一样。它应该采用数组或对象。我是否听说过是否使用Array.isArrayinstanceof确定传入的集合是对象还是数组,我目前的理解是使用{{1}事情是最好的方式。也许我完全错了。我已经在这几个小时里不知所措,并且非常感谢任何建议或意见。

我的功能似乎没问题,但它永远不会对我给它的任何数组或对象进行任何更改。如果它是一个对象,我想改变值,而不是属性名称。对不起,如果我的评论令人烦恼多余。请帮忙。

object.prototype.toString

这是一些愚蠢的数组和对象。对于每一个,我期待收集到位。我错了吗?



TgEach( collection, callback )




对于回调函数,让我们说我想添加3.所以为此...

var tgObj = {one: 1, two: 2, three: 3, four: 4, five: 5 };
var tgArr = [ 1,2,3,4,5];

// I'm invoking it like 

TgEach( tgObj, function(n){ return n + 3 } );
TgEach( tgArr, function(n){ return n + 3 } );

// I give it a collection and a callback - adding three to each item. 

// I'm expecting `tgArr` to now equal `[4, 5, 6, 7, 8]` and   
// `tgObj` to now equal `{ one: 4, two: 5, three: 6, four: 7, five: 8 };`

// But nothing ever happens... 
// Here's my function...

  var TgEach = function( collection, callback ){

  var dataStructure = 0;

   (function ObjectOrArray( collection ){
     if ( {}.toString.call( collection ) === "[object Array]" ){
       dataStructure += 1;
     }
     else if ( {}.toString.call( collection ) === "[object Object]" ){
       dataStructure += 2;
     }
   })();

  if ( dataStructure === 1 ){
    for ( var i = 0; i < collection.length; i++ ){
      callback( collection[i] );
   }
  else ( dataStructure === 2 ){
    for ( var key in collection ){
      callback( collection[key] );
  }
 }  
};

我希望TgEach( tgObj, function(n){ return n + 3 } ); TgEach( tgArr, function(n){ return n + 3 } ); 现在等于tgArr
[4, 5, 6, 7, 8]现在平等 tgObj

但什么都没发生......

{ one: 4, two: 5, three: 6, four: 7, five: 8 };

地图依赖于每一个,所以这让我全都压力

我的地图看起来像这样..

TgMap( collection, callback )

我到底做错了什么?

0 个答案:

没有答案