underscore에서 _.each와 _.맵의 차이

4076 단어
버전 1:
var number = ['ITEM000001','ITEM000003-2']
var obj_number = {}
var a = _.each(number,function(barcode){
        // ‘-’ key , ‘-’ ‘-’ ,'-' key
	barcode = barcode.split('-')
	obj_number[barcode[0]] = ( obj_number[barcode[0]] || 0 ) + ( parseFloat(barcode[1]) || 1 )
})
console.log(a)
console.log(JSON.stringify(obj_number))

                 a = ITEM000001,ITEM000003-2
obj_number = {"ITEM000001":1,"ITEM000003":2}
each 원수 그룹의 모든 원소를 훑어본 후, 순서대로 모든 함수가 실행된 원소를 출력하고, 여기에서 나는 모든 결과를 하나의 대상에 넣기 때문에 직접 출력한다
 
var obj_number = {}
var b = _.map(number,function(barcode){
	barcode = barcode.split('-')
	obj_number[barcode[0]] = ( obj_number[barcode[0]] || 0 ) + ( parseFloat(barcode[1]) || 1 )
})
console.log(b)
console.log(JSON.stringify(obj_number))

                 b = ,
obj_number = {"ITEM000001":1,"ITEM000003":2}
맵은 그룹의 모든 요소를 함수로 실행한 후 새 그룹에 넣지만, 반환 값을 설정하지 않으면 비어 있습니다 (구체적으로 다음과 같습니다)
 
var c = _.map(number,function(barcode){
        ' '+barcode
        })
console.log(c)

 c = ,
맵이 새 그룹을 만들었습니다. 함수가 모든 값을 실행하면 새 그룹에 값을 부여합니다. 그러나 되돌아오는 값이 없기 때문에 비어 있습니다.
 
var d = _.map(number,function(barcode){
        return ' '+barcode
        })
console.log(d)

d = 결과 ITEM000001, 결과 ITEM000003-2
반환값 설정
 
var e =  _.each(number,function(barcode){
        ' '+barcode
        })
var f = _.each(number,function(barcode){
        return g = ' '+barcode
        })
console.log(e)
console.log(f)
console.log(g)

e = ITEM000001,ITEM000003-2
f = ITEM000001,ITEM000003-2
g = 결과 ITEM000003-2
each는 모든 요소를 두루 훑어보며, 사용자가 스스로 수조를 만들어 저장하지 않으면 함수 실행 결과가 모두 사라집니다.
g는 하나의 결과만 출력합니다. 왜냐하면 each는 모든 요소를 순서대로 출력하기 때문입니다. 이런 형식으로 그룹 출력을 정의하면 모든 결과를 순서대로 g에게 부여하고 덮어씁니다. 현재 본인은push를 사용하여 새로운 그룹 (대상) 으로 밀어넣습니다.
버전 2:
맵은 입력 그룹과 같은 길이의 그룹을 만들고 리턴의 내용을 부여합니다. 따라서 필요한 결과가 그룹 형식이 아닐 때 each를 사용하는 것이 좋습니다. 그룹 형식의 결과라도 필요한 길이가 일치하지 않을 때, 예를 들어 그룹 중 몇 개만 결과를 입력할 때underfind가 발생합니다.
var a = _.map([1,2,3,4,5,6],function(num){
	if( num > 3 ){
		return num
	}
})
=>[undefined, undefined, undefined, 4, 5, 6]

compact와 함께 모든false값을 제거한 후에야 필요한 결과를 얻을 수 있습니다
compact_.compact(array) 
 javascript , false, null, 0, "", undefined   NaN  false .

_.compact([undefined, undefined, undefined, 4, 5, 6]);
=>[4,5,6]

보통 맵의 일일이 대응하는 특성을 사용하지 못할 때 each를 사용하면 돼요.
 
 
http://www.bootcss.com/
bootcss 관련 양질의 프로젝트 포함
 
마지막으로 each와 맵의 원본 코드를 첨부합니다.
//The cornerstone, an `each` implementation, aka `forEach`.
 //Handles raw objects in addition to array-likes. Treats all
 //sparse array-likes as if they were dense.
  _.each = _.forEach = function(obj, iteratee, context) {
    if (obj == null) return obj;
    iteratee = createCallback(iteratee, context);
    var i, length = obj.length;
    if (length === +length) {
      for (i = 0; i < length; i++) {
        iteratee(obj[i], i, obj);
      }
    } else {
      var keys = _.keys(obj);
      for (i = 0, length = keys.length; i < length; i++) {
        iteratee(obj[keys[i]], keys[i], obj);
      }
    }
    return obj;
  };
 
//iteratee (교체) 를 모든 요소에 적용한 결과를 되돌려줍니다.
  _.map = _.collect = function(obj, iteratee, context) {
    if (obj == null) return [];
    iteratee = _.iteratee(iteratee, context);
    var keys = obj.length !== +obj.length && _.keys(obj),
        length = (keys || obj).length,
        results = Array(length),
        currentKey;
    for (var index = 0; index < length; index++) {
      currentKey = keys ? keys[index] : index;
      results[index] = iteratee(obj[currentKey], currentKey, obj);
    }
    return results;
  };

좋은 웹페이지 즐겨찾기