繁体   English   中英

如何将选定的对象属性提取到具有Array类型的新创建的属性?

[英]How to extract selected Object properties to the newly created property with Array type?

我有一个JS集合(具有少量属性的对象数组)。

let xyz = [{
    categoryId: 1,
    categoryName: 'Test',
    programId: 112,
    programName: 'Program Test',
    value: 5050,
    value2: 1000
},
{
    categoryId: 2,
    categoryName: 'Test',
    programId: 112,
    programName: 'Program Test',
    value: 5050,
    value2: 1000
},
{
    categoryId: 3,
    categoryName: 'Test',
    programId: 112,
    programName: 'Program Test',
    value: 5050,
    value2: 1000
}]

如何使用LODASH将此类集合转换为以下结构(将values属性添加为来自'value'和'value2'的值数组:

let abc = [{
        categoryId: 1,
        categoryName: 'Test',
        programId: 112,
        programName: 'Program Test',
        values: [5050,1000]
    },
    ...
    ]

您需要使用基本映射操作来转换数组。 使用lodash:

let abc = _.map(xyz, function(el) {
    return {
        categoryId: el.categoryId,
        categoryName: el.categoryName,
        programId: el.programId,
        programName: el.programName,
        values: [el.value, el.value2]
    };
});

但是我宁愿使用Array.prototype.map函数来遵循“您不需要Lodash”趋势

如果您寻求某种灵活性,并且不知道对象可能具有的所有属性,但是想要将任何value*属性值合并在一起,那么可以在此ES6代码中找到灵感:

let res = xyz.map( o => Object.assign({}, 
    ...Object.keys(o).map(key => !key.test(/^value\d*$/) && ({ [key]: o[key]})),
    { values: Object.keys(o).filter(key => key.test(/^value\d*$/)).map(key => o[key]) }
));

 let xyz = [{ categoryId: 1, categoryName: 'Test', programId: 112, programName: 'Program Test', value: 5050, value2: 1000 }, { categoryId: 2, categoryName: 'Test', programId: 112, programName: 'Program Test', value: 5050, value2: 1000 }, { categoryId: 3, categoryName: 'Test', programId: 112, programName: 'Program Test', value: 5050, value2: 1000 }]; let res = xyz.map( o => Object.assign({}, ...Object.keys(o).map(key => !/^value\\d*$/.test(key) && ({ [key]: o[key]})), { values: Object.keys(o).filter(key => /^value\\d*$/.test(key)).map(key => o[key]) } )); console.log(res); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

如果值的顺序很重要,则在最后一个.map()之前,在链中注入一个sort

Lodash

使用lodash可能看起来像这样(这次坚持使用ES5代码):

var res = _.map(xyz, function (o) {
    return _.set(
        _.omitBy(o, function (v, key) { return /^value\d*$/.test(key) }),
        'values', 
        _.values(_.pickBy(o, function (v, key) { 
            return /^value\d*$/.test(key)
        }))
    );
});

你可以用_.merge

var res = _.map(xyz, function(item) {
    return _.merge(
        {}, // to avoid xyz mutations
        _.omit(item, ['value', 'value2']), // remove useless keys
        {values: _.at(item, ['value', 'value2'])} // get needed values
    );
});

我将以"value"开头的所有属性加在一起,以防万一。

 let xyz = [{ categoryId: 1, categoryName: 'Test', programId: 112, programName: 'Program Test', value: 5050, value2: 1000 }, { categoryId: 2, categoryName: 'Test', programId: 112, programName: 'Program Test', value: 5050, value2: 1000 }, { categoryId: 3, categoryName: 'Test', programId: 112, programName: 'Program Test', value: 5050, value2: 1000 }] let abc = _.map(xyz, function (obj) { var valuesKeys = _.filter(_.keys(obj), function (key) { return key.indexOf('value') === 0; }); let result = _.omit(obj, valuesKeys); result.values = _.reduce(_.values(_.pick(obj, valuesKeys)), _.add); return result; }); console.log(abc); 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script> 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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