Добавить новое свойство в коллекцию объектов на основе условия с помощью lodash

82
6

У меня есть массив объектов как таковой:

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 но я не уверен, как.

спросил(а) 2018-12-13T20:45:00+03:00 11 месяцев, 4 недели назад
4
Решение
53

Если вы довольны ванильным 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}]

ответил(а) 2018-12-13T21:11:00+03:00 11 месяцев, 4 недели назад
Еще 3 ответа
45

Вы можете сделать это с помощью 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>

ответил(а) 2018-12-13T21:05:00+03:00 11 месяцев, 4 недели назад
48

Вы можете отобразить массив и использовать новое свойство, если условие 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; }

ответил(а) 2018-12-13T20:50:00+03:00 11 месяцев, 4 недели назад
31

Вы можете сгенерировать функцию с помощью 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>

ответил(а) 2018-12-13T21:36:00+03:00 11 месяцев, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема