Добавить новое свойство в коллекцию объектов на основе условия с помощью lodash - PullRequest
0 голосов
/ 13 декабря 2018

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

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 но я не знаю как.

Ответы [ 4 ]

0 голосов
/ 13 декабря 2018

Вы можете сгенерировать функцию с помощью 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>
0 голосов
/ 13 декабря 2018

Вы можете сделать это с помощью 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>
0 голосов
/ 13 декабря 2018

Если вы довольны ванильным 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}]
0 голосов
/ 13 декабря 2018

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