【问题标题】:How to transform a nested array into string if it contains null values or just an empty one?如果嵌套数组包含空值或只是一个空值,如何将它转换为字符串?
【发布时间】:2020-07-18 12:26:57
【问题描述】:

我需要用 "empty" 这样的字符串值替换主数组中具有空值的嵌套数组,例如 [null, null] 或空的嵌套数组。

假设我们有以下数组:

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));

来自这个Stack Overflow answer,但我收到一条错误消息:

错误:subarray.filter 不是函数

然后我尝试了第二种方法,使用lodash'severy()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)
    }
  });
}

我在 Stack Overflow 上搜索了几个问题,但数组的结构类似于:[ [1, 2], [1,3]...],而不像我的数组结构[{...}, {...}],所以我尝试了一些解决方案,得到了与上述方法 1 相同的错误。

这是stackblitz

【问题讨论】:

  • [][null, null] 数组是否始终是 phone 属性的值,或者您想替换整个对象中所有出现的 [null, null](无论其属性如何) /键是)
  • 有些用户已有电话号码,有些则没有。我在这里举了一个关于电话号码的例子,但我的数据中还有其他字段可能会遇到同样的问题。

标签: javascript arrays typescript multidimensional-array lodash


【解决方案1】:

首先循环遍历数组,在每个对象内,可以设置电话属性:

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

需要注意的是,这会编辑您的数组。关于问题前提的一个担忧是您将数组属性设置为字符串,这并不理想。

实时示例: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
  };
});

【讨论】:

  • 谢谢。我在 Visual Studio 代码中不断收到“无法读取 null 的属性‘过滤器’”的奇怪现象
  • 我发现当一个数组的字段即使它不是一个数组,像一个字符串但null如下,这里它返回错误。请考虑这里phone 是一个示例,我需要遍历我的数组的所有具有数组对象类型的属性并检查是否为空或为空
  • 你是说键也可以有 null 作为值?
【解决方案2】:

映射数组,并在每个对象上使用_.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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-08
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-12
    相关资源
    最近更新 更多