Как преобразовать вложенный массив в строку, если он содержит нулевые значения или просто пустое? - PullRequest
0 голосов
/ 06 апреля 2020

Мне нужно заменить вложенные массивы внутри основного массива с нулевыми значениями, например, скажем, [null, null], или вложенные массивы, которые являются пустыми, со строковым значением, таким как "empty".

Говоря, что у нас есть следующий массив:

array = [
  {
    id: 123, 
    name: 'Peter',
    phone: [null, null],
    addresses: [{ address1: 'Manchester, UK', address2: 'London, UK' }]
  },
  {
    id: 124,
    name: 'Sara',
    phone: [],
    addresses: [{ address1: 'London, UK', address2: 'Paris, FR' }]
  }
];

Мы видим, что первый массив имеет телефон: [null, null], а второй - []. Что мне нужно сделать, чтобы преобразовать их в следующее:

array = [
  {
    id: 123, 
    name: 'Peter',
    phone: "empty",
    addresses: [{ address1: 'Manchester, UK', address2: 'London, UK' }]
  },
  {
    id: 124,
    name: 'Sara',
    phone: "empty",
    addresses: [{ address1: 'London, UK', address2: 'Paris, FR' }]
  }
];

Это пример, и каждый массив может содержать несколько вложенных массивов с одинаковыми [null, null] или [].

Я попробовал следующее:

var filtered = this.array.map(subarray => subarray.filter(el => el != null));

из этого Ответа переполнения стека , но у меня есть ошибка, говорящая:

Ошибка: subarray .filter не является функцией

Затем я попробовал второй метод, используя метод и свойство lodash's every() и isNull, но не смог понять:

let props = [];
props = Array.from(new Set(this.array.flatMap(e => Object.keys(e), [])));
console.log(props)
for (const prop of props) {
  this.array.forEach(e => {
    if ((Array.isArray(e[prop]) || typeof(e[prop]) === 'object') && e[prop]._.every(_.isNull)) {
      console.log(e)
    }
  });
}

Я искал несколько вопросов о переполнении стека, но структура массивов выглядит следующим образом: [ [1, 2], [1,3]...], а не как структура моего массива [{...}, {...}], поэтому я попробовал некоторые решения и получил ту же ошибку, что и в методе 1 выше.

Вот стек-блиц .

Ответы [ 2 ]

1 голос
/ 07 апреля 2020

Отобразить массив и использовать _.mapValues() для каждого объекта. Для каждого значения, которое является массивом и полным null значений, верните 'empty':

const array = [{"id":123,"name":"Peter","phone":[null,null],"addresses":[{"address1":"Manchester, UK","address2":"London, UK"}]},{"id":124,"name":"Sara","phone":[],"addresses":[{"address1":"London, UK","address2":"Paris, FR"}]}];

const result = array.map(o => 
  _.mapValues(o, v => // map the values of the object
    _.isArray(v) && v.every(_.isNull) ? 'empty' : v // if a value is an array, and all values are null return 'empty'
  )
);

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"></script>
1 голос
/ 06 апреля 2020

Сначала l oop через массив, и внутри каждого объекта вы можете установить свойство телефона:

for(const entry of array) {
    const isEmpty = entry.phone.filter(p => p !== null).length === 0;
    entry.phone = isEmpty ? 'empty' : entry.phone;
}

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

Live Пример: https://jsfiddle.net/michaschwab/9ze3p2or/3/, и вот ваш отредактированный stackblitz: https://stackblitz.com/edit/null-nested-array-into-string-jwhfwn

Если вы не хотите изменять свой массив, это можно сделать следующим образом:

const modified = array.map(entry => {
  return {...entry, // Copy previous values
    phone: entry.phone.filter(p => p !== null).length === 0 ? 'empty' : entry.phone
  };
});
...