Удалить свойства, которые имеют пустой массив в качестве значения? - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть этот объект, и я пытаюсь сделать следующее:

1) Удалить свойства, в качестве значения которых используется пустой массив.

2) Если значение свойстваявляется массивом, который имеет только 1 элемент, затем установите значение этого элемента вместо массива.

Пример:

colors: ['blue'] 

, а затем просто установите его на

colors: 'blue'

Пока у меня есть этот код, который удаляет только те свойства, значения которых равны нулю

var obj = {name: 'John', lastname: 'Smith', colores: ['blue'], movies: [], age: 20, country: null};

var result = _.pickBy(obj);
console.log(result); // {name: "John", lastname: "Smith", colores: Array(1), movies: Array(0), age: 20}

Как заставить его работать, чтобы он возвращал это:

{name: "John", lastname: "Smith", colores: 'blue', age: 20}

Ответы [ 2 ]

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

Вы можете использовать _.omitBy и _.mapValues:

let obj = { name: 'John', lastname: 'Smith', colores: ['blue'], movies: [], age: 20, country: null }; 

let result = _.omitBy(obj, x => _.isEmpty(x) && !_.isNumber(x))
result = _.mapValues(result, x => _.isArray(x) && !_.isEmpty(x) ? _.first(x) : x)

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

С цепочкой:

let obj = { name: 'John', lastname: 'Smith', colores: ['blue'], movies: [], age: 20, country: null };

let result = _(obj)
  .omitBy(x => _.isEmpty(x) && !_.isNumber(x))
  .mapValues(x => _.isArray(x) && x.length == 1 ? _.first(x) : x)
  .value()

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>
0 голосов
/ 19 декабря 2018

Вы можете использовать _.transform() для изменения значений объекта и удаления ключей:

var obj = {name: 'John', lastname: 'Smith', colores: ['blue'], movies: [], age: 20, country: null};

var result = _.transform(obj, (acc, v, k) => {
  if(_.isNil(v) || _.isObject(v) && _.isEmpty(v)) return;
  
  if(_.isArray(v) && _.eq(v.length, 1)) acc[k] = _.head(v);
  else acc[k] = v;
});

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