2015-02-06 4 views
0

소스 데이터 :누군가가 Lodash/Underscore/Javascript/jQuery를 사용하여 나를 도울 수 있습니까?

{ 
    [ 
    { code: 'A01', name: 'nameA01'}, 
    { code: 'A02', name: 'nameA02'}, 
    { code: 'A03', name: 'nameA03'}, 
    { code: 'A04', name: 'nameA04'}, 
    { code: 'A05', name: 'nameA05'}, 
    { code: 'A06', name: 'nameA06'}, 
    { code: 'A07', name: 'nameA07'}, 
    { code: 'A08', name: 'nameA08'}, 
    { code: 'A09', name: 'nameA09'}, 
    { code: 'A10', name: 'nameA10'}, 
    { code: 'A11', name: 'nameA11'}, 
    { code: 'A12', name: 'nameA12'}, 
    { code: 'A13', name: 'nameA13'} 
    ... 
    ] 
} 

대상 데이터 :

{ 
    [ 
    { ItemA: 1, codeA: 'A01', nameA: 'nameA01', ItemB: 2, codeB: 'A02', nameB: 'nameA02', ItemC: 3, codeC: 'A03', nameC: 'nameA03'}, 
    { ItemA: 4, codeA: 'A04', nameA: 'nameA04', ItemB: 5, codeB: 'A05', nameB: 'nameA05', ItemC: 6, codeC: 'A06', nameC: 'nameA06'}, 
    { ItemA: 7, codeA: 'A07', nameA: 'nameA07', ItemB: 8, codeB: 'A08', nameB: 'nameA08', ItemC: 9, codeC: 'A09', nameC: 'nameA09'}, 
    { ItemA: 10, codeA: 'A13', nameA: 'nameA13', ...} 
    ] 
} 

나는 그것이 비현실적이다, 몇 일 전에했다. 누군가가 Lodash/Underscore/Javascript/jQuery를 사용하여 '원본 데이터'에서 '대상 데이터'로 데이터를 조작 할 수 있습니까?

대단히 감사합니다.

+0

Lodash/밑줄/자바 aScript/jQuery? 그럼 * 어느 쪽? – Arran

+0

원래 형식의 문제점은 무엇입니까? 두 번째 것은 훨씬 나 빠졌다. – jgillich

답변

0
var src = [ 
    { code: 'A01', name: 'nameA01'}, 
    { code: 'A02', name: 'nameA02'}, 
    { code: 'A03', name: 'nameA03'}, 
    { code: 'A04', name: 'nameA04'}, 
    { code: 'A05', name: 'nameA05'}, 
    { code: 'A06', name: 'nameA06'}, 
    { code: 'A07', name: 'nameA07'}, 
    { code: 'A08', name: 'nameA08'}, 
    { code: 'A09', name: 'nameA09'}, 
    { code: 'A10', name: 'nameA10'}, 
    { code: 'A11', name: 'nameA11'}, 
    { code: 'A12', name: 'nameA12'}, 
    { code: 'A13', name: 'nameA13'} 
]; 

var getItemNum = function(item) { 
    return +item.code.replace(/\w+(\d{2})/, '$1'); 
} 

var groupBy3 = function(item) { 
    return Math.floor((getItemNum(item) - 1)/3); 
} 

var dst = _.map(_.groupBy(src, groupBy3), function(items){ 
    var res = {} 
    var letters = ['A', 'B', 'C']; 
    for (var i = 0; i < items.length; i++) { 
     res['Item' + letters[i]] = getItemNum(items[i]); 
     res['code' + letters[i]] = items[i].code; 
     res['name' + letters[i]] = items[i].name; 
    } 

    return res; 
}); 

http://jsfiddle.net/onlite/mzcq4Lcd/

UPD :

최적화 된 버전 :

var src = [ 
    { code: 'A01', name: 'nameA01'}, 
    //... 
]; 

var getItemNum = function(item) { 
    return +item.code.replace(/\w+(\d{2})/, '$1'); 
} 

var letters = ['A', 'B', 'C']; 

var dst = _.reduce(src, function(res, item, i){ 
    var groupIndex = Math.floor(i/3); 
    var letter = letters[i % 3]; 

    var group = res[groupIndex] || (res[groupIndex] = {}); 

    group['Item' + letter] = getItemNum(item); 
    group['code' + letter] = item.code; 
    group['name' + letter] = item.name;  

    return res; 
}, []); 

http://jsfiddle.net/onlite/n6zgzo93/

+0

정말 고마워요! 나를 위해. – user2830412

-1

흥미로운 질문 : d. 이 (코드는 아직 최적화되지 않음)보십시오 :

 var a = 
      [ 
      { code: 'A01', name: 'nameA01'}, 
      { code: 'A02', name: 'nameA02'}, 
      { code: 'A03', name: 'nameA03'}, 
      { code: 'A04', name: 'nameA04'}, 
      { code: 'A05', name: 'nameA05'}, 
      { code: 'A06', name: 'nameA06'}, 
      { code: 'A07', name: 'nameA07'}, 
      { code: 'A08', name: 'nameA08'}, 
      { code: 'A09', name: 'nameA09'}, 
      { code: 'A10', name: 'nameA10'}, 
      { code: 'A11', name: 'nameA11'}, 
      { code: 'A12', name: 'nameA12'}, 
      { code: 'A13', name: 'nameA13'} 
      ]; 
     var result = _.reduce(a, function(memo, item, index) { 
      var mod = index % 3; 
      if (mod === 0) { 
       var newObj = { 
        ItemA: index + 1, 
        codeA: item.code, 
        nameA: item.name  
       }; 
       memo.push(newObj); 
       return memo; 
      } else if (mod === 1) { 
       _.extend(memo[memo.length - 1], { 
        ItemB: index + 1, 
        codeB: item.code, 
        nameB: item.name  
       }); 
       return memo; 
      } else if (mod === 2) { 
       _.extend(memo[memo.length - 1], { 
        ItemC: index + 1, 
        codeC: item.code, 
        nameC: item.name  
       }); 
       return memo; 
      } 
     }, []); 
     console.log(result); 
+0

감사합니다, 당신은 저를 고무시키고 있습니다! – user2830412