【问题标题】:Turn Array Into String, Separate String With Separator - JavaScript将数组转换为字符串,用分隔符分隔字符串 - JavaScript
【发布时间】:2019-08-23 03:34:57
【问题描述】:

定义一个函数myJoin,最多接受两个参数:

  1. array
  2. separator(字符串,可选)

myJoin 应该返回一个字符串,该字符串将数组中的所有元素连接在一起。分隔符应该分隔连接的元素:

myJoin(['a', 'b', 'c'], '+'); // => "a+b+c"

如果未定义分隔符,则使用',' 作为默认分隔符。

myJoin(['Peter', 'Paul', 'Mary']); // => "Peter,Paul,Mary"

如果数组中的任何元素是undefinednull,则应在返回的字符串中将它们替换为空字符串。

myJoin(['hello', undefined, 'world'], '-'); // => "hello--world"

我无法使用内置的join 方法。

Link to codepen for testing

到目前为止我已经尝试过:

function myJoin (array, separator) {

  let newString = "";

  if (separator = undefined) {
    separator === ",";
  }

  else {

    for (let i = 0; i < array.length; i++) {
      newString = i + separator;
    }

  }

  newString = array.toString();

  return newString;

}

console.log(myJoin(['a', 'b', 'c'], '+'));

^ 这不是将字符串的元素与分隔符组合在一起,实际上是两次返回a,b,c。知道为什么吗?

编辑:在@Jonas Wilms 的建议之后首次更新代码:

function myJoin (array, separator) {

  let newString = "";

  if (separator === undefined) {
    separator === ",";
  }

  for (let i = 0; i < array.length; i++) {
    newString += array[i] + separator;
  }

  return newString;

}

这似乎在我的 VS Code 控制台中有效,但在 CodePen 中无效。

【问题讨论】:

  • 你能解释一下你的代码吗?
  • for 循环不应该在else 子句中,if 测试中的比较应该是== 而不是== 是针对 分配)。
  • 当然我想说的是,如果定义了分隔符,则循环遍历数组以使用数组中的项目 (i) + separator 创建一个 newString。然后将newString转成字符串返回。
  • 代码if (separator = undefined) 正在将变量分隔符分配给undefined 值,而不是您期望的比较。

标签: javascript arrays string function separator


【解决方案1】:

试试

array.reduce( (s,x,i) => s+(i>0 ? separator : '') + (x==null ? '' : x), '') 

function myJoin(array, separator=',') { 
  return array.reduce( (s,x,i) => s+(i>0 ? separator : '') + (x==null ? '' : x), '') 
}

console.log( myJoin(['a', 'b', 'c'], '+') ); 
console.log( myJoin(['Peter', 'Paul', 'Mary']) );
console.log( myJoin(['hello', undefined, 'world'], '-') );

我们在这里使用标准 js 功能:arrow functionsarray reduceternary operator。如果i&gt;0(不仅对第一个元素为真),我们将分隔符添加到输出字符串s。如果 xundefined or null 我们添加到 s 空字符串 - 或 x 在其他情况下的值。

【讨论】:

    【解决方案2】:

    function myJoin(array, separator=',') {
      let str = '';
      for (let i = 0; i < array.length; i++) {
        if (array[i] !== null && array[i] !== undefined)
          str += array[i];
        if (i < array.length - 1)
          str += separator;
      }
    
      return str;
    }
    
    console.log(myJoin(['a','b','c']));
    console.log(myJoin(['a','b','c'], '+'));
    console.log(myJoin(['a',null,'c'], '-'));
    console.log(myJoin(['a','b',undefined], '.'));

    【讨论】:

    • 对不起,我不明白...params作为参数的使用。你能用我的代码中的参数arrayseparator重写它吗?
    • @HappyHands31 ...params 获取所有参数并用它形成一个数组。但是现在有了这两个参数就更容易理解了
    • 谢谢 - 是的,现在它是有意义的,它的工作原理。那么对于你的两个if-statements,它在将array[i]separator 附加到str 之间交替进行?那么if-statements 会替换它们默认附加的内容吗?
    • 第一个 if 检查您的值是否应该附加到字符串(不是 null 也不是未定义的)。第二个if 检查如果我们在数组的最后一项,我们不放置分隔符(避免将分隔符放在末尾)
    • separator=',' 表示“默认值”。因此,如果你只给一个参数,分隔符将被设置为','。如果您提供 2 个参数,则“,”将被您的第二个参数覆盖
    【解决方案3】:

    一些提示:

    • 不要混淆赋值 (=) 和比较 (===) 运算符。 if(a = b) 在 99% 的情况下都是错误的。

    • array.toString() 确实在内部调用array.join(),我认为这是作弊,我也不确定你想用它实现什么(我的意思是newString 应该已经包含想要的结果,如果你正确地循环,不是吗?)

    • i 是您的array 中的索引,用于获取该位置的,使用array[i]

    • 我认为你的循环不应该在else { 分支中,我认为你根本不需要else(因为你总是想通过循环加入数组) .

    • 使用newString =重新分配 newString 并松开以前的值,你可能想要使用newString +=追加一个值。

    【讨论】:

    • 请查看我最近的编辑 - 我已尝试尽可能多地利用您的提示。
    • @happyHands31 您还在最后一项上添加了一个分隔符,结果是“a,b,c,”...
    • 所以我需要从返回的数组中删除最后一项?使用.pop().slice()?
    【解决方案4】:

    使用默认语法设置分隔符|| forEach value, index, array 测试最后一个元素。

    function myJoin (array, separator) {
      let newString = "";
      separator = separator||','; 
      
      array.forEach((a,i,arr) => {
        newString += `${a}${(i < arr.length-1) ? separator : ''}`;
      });
      return newString;
    }
    
    console.log(myJoin(['a', 'b', 'c'], '+'));
    console.log(myJoin(['a', 'b', 'c']));
    console.log(myJoin(['a', 'b', 'c'], '-'));

    【讨论】:

    • 为什么一段工作代码会在没有评论的情况下被否决?
    【解决方案5】:

    mapforEach 与模板字符串一起使用,如下所示:

    function myJoin(arr, sep = ",") {
      arr = arr.map(e => [undefined, null].includes(e) ? "" : e);
      var result = "";
      arr.forEach((e, i) => result += `${i ? sep : ""}${e}`);
      return result;
    }
    
    console.log(myJoin(['Peter', undefined, 'Paul', null, 'Mary', 'Jack'], "-"));

    ES5 语法:

    function myJoin(arr, sep) {
      sep = sep || ",";
      arr = arr.map(function(e) {
        return [undefined, null].includes(e) ? "" : e;
      });
      var result = "";
      arr.forEach(function(e, i) {
        result += (i ? sep : "") + e;
      });
      return result;
    }
    
    console.log(myJoin(['Peter', undefined, 'Paul', null, 'Mary', 'Jack'], "-"));

    【讨论】:

    • Do not use the built-in .join array method in your answer.
    • 已修复@Keith。
    【解决方案6】:

    您可以使用Array.reduce() 加入您的阵列。

    let arr = ['a', 'b', undefined, 'c', 'd', null, 'e'];
    
    myJoin = (arr, separator = ',') =>
      arr.reduce((acc, val, i) =>
        acc + ([undefined, null].indexOf(val) >= 0 ? '' : val) +
        (i < arr.length - 1 ? separator : ''), "");
    
    console.log('myJoin(arr): ', myJoin(arr));
    console.log('myJoin(arr, "+"): ', myJoin(arr, '+'));
    console.log('arr.join("+"): ', arr.join('+'));

    希望这会有所帮助,

    【讨论】:

    • 使用数组来检查值是null 还是undefined 恕我直言有点矫枉过正。 val == null 很好,因为 undefinednull 大致相等。
    • @customcommander 是的,我知道,我想现在只是习惯的力量:/
    猜你喜欢
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    • 1970-01-01
    相关资源
    最近更新 更多