【问题标题】:using .map in array of string but return undefined for empty string [duplicate]在字符串数组中使用.map,但为空字符串返回未定义[重复]
【发布时间】:2020-02-11 20:15:43
【问题描述】:

我有这个模式的文本文件。用 enter 或 \n 分隔的数字列表。在文件末尾有很多输入

1
2
3



... //my main is enter

当我用这段代码读取这个文件并记录内容时,输出是并且 typeof 是字符串:

var contents = fs.readFileSync('./myFile', 'utf8');

1
2
3



...

然后我想用\n 拆分此数据并将此字符串转换为数组。使用此代码。但最终答案是: contents.split("\n")有数据:[1, 2, 3, '', '', '', '']

var listOfNationalCode = contents.split("\n").map(function (n) {
        if (n != '') {
            return n;
        }
    }); 
console.log(listOfNationalCode);

[ '1',
  '2',
  '3',
  undefined,
  undefined,
  undefined,
  undefined ]

我现在应该怎么做才能在这段代码中不返回undefined?我有[1, 2, 3]

【问题讨论】:

  • if (n != '') { return n; } 返回n 如果它不是一个空字符串否则未定义。如果没有其他 return,所有函数都会隐式返回 undefined。此外,映射是一种 1:1 操作 - 原始数组的每个成员都会产生一个映射值。您可能正在寻找Array#filter
  • .split()之前使用.trim()contents.trim().split("\n")...
  • @VLAZ:既然您的评论实际上就是答案,为什么不这样发布呢?在 SO 上,让 cmets 比答案更有用变得很常见,这很痛苦,因为 cmets 难以阅读且无法在 Google 上搜索。
  • @georg 我一直在寻找一个好的欺骗目标。毕竟,这不是一个新问题。我认为我们不需要数百个基本上是“map 是这样工作的,filter 是这样工作的”的答案。
  • @VLAZ,你的评论对我有帮助。

标签: javascript node.js


【解决方案1】:

试试这个

let l=[1, 2, 3, '', '', '', ''].filter(function (n) {
        if (n != '') {
            return n;
        }
    }); 
console.log(l);

【讨论】:

  • 不需要if - 只需返回n != ''。即使return n 也可以,因为空字符串是错误的。更进一步,您甚至不需要自定义函数 - .filter(Boolean) 就足够了。
【解决方案2】:

正如评论中所说,映射是 1:1 操作,因此您不能仅返回某些值的结果。

改用Array.filter() 方法:

var listOfNationalCode = contents.split("\n").filter( n => n != '' ); 
console.log(listOfNationalCode);

【讨论】:

    【解决方案3】:

    你可以试试这个:

    var listOfNationalCode = [];
    contents.split("\n").map(function (n) {
        if (n != '') {
            listOfNationalCode.push(n)
        }
    }); 
    console.log(listOfNationalCode);
    

    【讨论】:

      猜你喜欢
      • 2016-07-13
      • 1970-01-01
      • 1970-01-01
      • 2019-09-27
      • 2018-09-27
      • 1970-01-01
      • 2020-08-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多