Добавить новое свойство в коллекцию объектов на основе условия с помощью lodash
У меня есть массив объектов как таковой:
var data = [{ a: 1 },
{ a: 1 },
{ a: 2 },
{ a: 2 }];
Как я могу создать с lodash, новый массив, так же, как data
, но для которых мы добавили новое свойство b: 1
для каждого объекта с этим обладает свойством равного a
1
?
Новый массив должен быть таким:
var newdata = [{ a: 1, b: 1 },
{ a: 1, b: 1 },
{ a: 2 },
{ a: 2 }];
Я думаю, мы могли бы объединить _.assign
и _.filer
но я не уверен, как.
Если вы довольны ванильным 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}]
Вы можете сделать это с помощью lodash через _.defaults
или _.assign/_.assignIn/_.extend
:
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>
Вы можете отобразить массив и использовать новое свойство, если условие 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);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Вы можете сгенерировать функцию с помощью lodash, применив _.cond()
к _.map()
с помощью _.partialRight
.
Используйте _.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>