【问题标题】:How to trim array elements inside an array? [duplicate]如何修剪数组内的数组元素? [复制]
【发布时间】:2021-05-11 04:21:39
【问题描述】:

我有一个这样的数组:

const allData = 
[
  ['Alex   ','foo@email','   ',],
  ['  ','goo@gmail, '232-333-2222'],
]

我想修剪数组中的所有值,例如,'Alex ' 变为 'Alex'

我已经尝试了这些解决方案:

for (let data of allData.entries()) {
    for (let content of data) {
        content.trim();
    }
}
allData.forEach((data) => {
    data.forEach((content) => {
        content.trim();
    });
});
allData.map((data, index) => {
    return data.map((content) => content.trim());
});

我也尝试过content = content.trim();

但即使它确实修剪了值,它也不会将修改后的值保存在数组中。

我错过了什么?我希望 allData 包含修剪后的值。

【问题讨论】:

  • content.trim(); 本身只是一个没有变化的表达式,因为它没有被分配给任何东西。
  • 您的代码会进行修剪,但不会将修剪后的值存储回数组。
  • let 创建一个范围绑定实例。因此,在其他范围内分配它是徒劳的
  • trim 不会修改原始字符串,因为它们是不可变的。您需要通过将内部 forEach 更改为:data.forEach((content, i) => data[i] = content.trim() ) 来替换数组的索引
  • content = content.trim() 只是用修剪后的字符串重新分配本地参数content。它不会更新原始数组。

标签: javascript arrays


【解决方案1】:

您的代码没有问题(第三版)。唯一的误解是.map()没有修改原来的数组,而是返回一个新的。看:

// This is basically your code.
const allData = 
[
  ['Alex   ','foo@email','   ',],
  ['  ','goo@gmail', '232-333-2222'],
];

 const trimmedAllData = allData.map((data, index) => {
    return data.map((content) => content.trim());
 });
 
 console.log(trimmedAllData);

您的第二次尝试可以轻松修复以修改原始allData 值:

const allData = 
[
  ['Alex   ','foo@email','   '],
  ['  ','goo@gmail', '232-333-2222'],
];

allData.forEach((data, i) => {
    data.forEach((content, j) => {
        allData[i][j] = content.trim(); // You have to write the trimmed value back!
    });
});
 
console.log(allData);

第一个版本不够好。

【讨论】:

  • 这与map 不修改原始数组无关。甚至 forEach 也不适用于 OP
  • @adiga:我认为确实如此。 OP 有一个基本的误解,因为您可以清楚地看到他/她的第一个和第二个解决方案。对于第三个,我认为它基本上是相同的问题。因此,虽然这提供了一个解决方案,但我不确定它是否完全消除了 OP 的误解。
  • @KrisztiánBalla 答案没有解释为什么content.trim()forEach 中不起作用或为什么content = content.trim() 不起作用。
  • @adiga 我认为这正是我所说的。 :-)
  • 谢谢大家。为了更容易理解,我稍微扩展了我的答案。
【解决方案2】:

您可以使用两个嵌套的.map 并将结果保存在一个新变量res 中:

const allData = 
[
  ['Alex   ','foo@email','   ',],
  ['  ','goo@gmail', '232-333-2222'],
];

const res = allData.map( arr => arr.map(e => e.trim()) );

console.log(res);

如果你想使用for循环,你需要直接改变元素:

const allData = 
[
  ['Alex   ','foo@email','   ',],
  ['  ','goo@gmail', '232-333-2222'],
];

allData.forEach((data,i) => {
  data.forEach((content,j) => {
    allData[i][j] = content.trim();
  });
});

console.log(allData);

【讨论】:

    猜你喜欢
    • 2022-12-22
    • 2019-06-11
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    • 2018-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多