我有一个这样的对象数组:
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
,但是我不确定如何合并。
答案 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>