简体   繁体   中英

Can somebody help me using Lodash/Underscore/Javascript/jQuery?

Source data:

{
  [
    { 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'}
    ...
  ]
}

Target data:

{
  [
    { 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', ...}
  ]
}

I made a few days ago , it is impractical. Can somebody help me using Lodash/Underscore/Javascript/jQuery manipulate data from 'Source data' to 'Target data'?

Thank you very much.

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:

optimized version:

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/

Interesting question :d. Try this (the code is not optimized yet):

        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);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM