使用lodash根据条件将新属性添加到对象集合

时间:2018-12-13 17:45:39

标签: javascript lodash

我有一个这样的对象数组:

var data = [{ a: 1 },
            { a: 1 },
            { a: 2 },
            { a: 2 }];

如何使用lodash创建一个新数组,就像data一样,但是我们为此向每个具有属性{{1}的对象添加了新属性b: 1 }等于a

新数组应如下所示:

1

我想我们可以同时合并var newdata = [{ a: 1, b: 1 }, { a: 1, b: 1 }, { a: 2 }, { a: 2 }]; _.assign,但是我不确定如何合并。

4 个答案:

答案 0 :(得分:1)

如果条件为col,则可以映射数组并使用新属性。

true
var data = [{ a: 1 }, { a: 1 }, { a: 2 }, { a: 2 }],
    newData = data.map(o => Object.assign({}, o, o.a === 1 && { b: 2 }));

console.log(newData);

答案 1 :(得分:1)

您可以通过_.defaults_.assign / _.assignIn / _.extend使用lodash来做到这一点:

var data = [{ a: 1 },{ a: 1 },{ a: 2 },{ a: 2 }];

console.log(_.map(data, x => x.a==1 ? _.defaults(x, {b: 1}) : x))
console.log(_.map(data, x => x.a==1 ? _.assign(x, {b: 1}) : x))
console.log(_.map(data, x => x.a==1 ? _.assignIn(x, {b: 1}) : x))
console.log(_.map(data, x => x.a==1 ? _.extend(x, {b: 1}) : x))
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>

答案 2 :(得分:0)

如果您对香草Javascript感到满意,则可以使用以下方法:

    var data = [{ a: 1 },
                { a: 1 },
                { a: 2 },
                { a: 2 }];

    var newData = [];

    newData =  data.reduce((acc, el) => {
        return el.a === 1 ?  acc.concat({a: el.a, b: 1}) :  acc.concat(el);
    }, []);

    console.log(newData);
// expected output: [{a: 1, b: 1},
//                   {a: 1, b: 1},
//                   {a: 2},
//                   {a: 2}]

答案 3 :(得分:0)

通过使用_.cond()_.map()应用于_.partialRight,可以使用lodash生成函数。

使用_.matches()检测对象是否具有a: 1属性,如果存在,则使用_.assign() { b: 1 }

a不是1时,请使用_.stubTrue()总是通过_.identity()返回原始对象:

var func = _.partialRight(_.map, _.cond([
  [_.matches({ 'a': 1 }), o => _.assign({}, o, { b: 2 })],
  [_.stubTrue,            _.identity]
]));

var data = [{ a: 1 },{ a: 1 },{ a: 2 },{ a: 2 }];
            
const result = func(data);

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>