【问题标题】:Can somebody help me using Lodash/Underscore/Javascript/jQuery?有人可以帮我使用 Lodash/Underscore/Javascript/jQuery 吗?
【发布时间】:2015-02-06 08:43:42
【问题描述】:

来源数据:

{
  [
    { 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 操作从“源数据”到“目标数据”的数据吗?

非常感谢。

【问题讨论】:

  • Lodash/Underscore/JavaScript/jQuery?那么哪一个
  • 原来的格式有什么问题?第二个看起来更糟。

标签: javascript jquery underscore.js lodash


【解决方案1】:
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/

更新:

优化版:

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/

【讨论】:

  • 非常感谢,完美!对我来说。
【解决方案2】:

有趣的问题: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);

【讨论】:

  • 谢谢你,你启发了我!
猜你喜欢
  • 1970-01-01
  • 2016-07-25
  • 1970-01-01
  • 2022-06-14
  • 1970-01-01
  • 1970-01-01
  • 2015-12-06
  • 2021-05-30
  • 2011-12-11
相关资源
最近更新 更多