【问题标题】:How do I join an array with the result not being a string in Javascript? [duplicate]如何在 Javascript 中加入结果不是字符串的数组? [复制]
【发布时间】:2017-02-28 11:45:17
【问题描述】:

我有一个数组[1,2,3,4,5,6] 和一个分隔符'~',我想将它们连接成一个新数组,'~' 是分隔符。

我希望输出为[1,'~', 2,'~', 3,'~', 4,'~', 5,'~', 6]

使用Lodash 我得到了类似的东西:

var my_array = [1,2,3,4,5,6]
var separator = '~'
_.flatten(_.zip(my_array, new Array(my_array.length).fill(separator)))

但这感觉很难看,我相信有更好的方法。

编辑:即使上面的数组有 ints 我希望它适用于任何类型的对象。

【问题讨论】:

  • 为什么不只是一个漂亮的简单循环?
  • 一个漂亮的简单循环就可以解决问题,但需要在长度上使用手动-1。正在寻找更漂亮的东西。
  • "...但是会强制要求手册的长度为 -1..." 嗯?
  • join 是一个很难实现的操作,因为它具有固有的对称性破坏。
  • 问题已经结束,但是单行 ES6 将是:var r = Array.from({ length: (a.length * 2) - 1 }, (v, i) => i % 2 ? s : a[i/2] ); 其中a 是您的数组,s 是您的“~”。代码笔:codepen.io/cjke/pen/pejPOQ?editors=0010

标签: javascript lodash


【解决方案1】:

为什么不在 pue Javascript 中:

次要更新: 考虑大于 9 的值

  • 首先将它加入一个字符串my_array.join("~")
  • 然后拆分每个字符.split(/\b/gi)

var my_array = [1,2,3,4,5,6,10,11]
var separator = '~'

console.info(my_array.join("~").split(/\b/gi));

更新(即使关闭):

关于点,其他对象。这应该可以工作,即使不是单行。

var myArray = [1,2,3,45,6,10,new Date()];

var newArray = myArray.reduce((p,n)=>{ 
  if(p.length){
    p.push("~");
  }
  p.push(n);
  return p;
},[]);

console.info(newArray)

【讨论】:

  • 一旦数组中有10或更高的值,或者小于0的值,或者不是数字,或者,或者,或者......
  • 另外,它假设每个对象都有一个好的 toString 实现。
  • 如果数组不支持字符串,例如日期,则会失败。
  • 用许多其他故障模式(包括我提到的那些负数)来解决这个问题仍然是一种可怕的方式。
  • 嗯,那是你更新前 10 分钟(很明显)。
【解决方案2】:

不错的简单forEach 没有十几个临时数组等:

var my_array = [1,2,3,4,5,6];
var result = [my_array[0]];
my_array.forEach(function(entry, index) {
  if (index > 0) {
    result.push("~", entry);
  }
});
console.log(result);

或者你可以用一个临时数组去掉if

var my_array = [1,2,3,4,5,6];
var result = [my_array[0]];
my_array.slice(1).forEach(function(entry, index) {
  result.push("~", entry);
});
console.log(result);

【讨论】:

  • FTW!!谢谢!!
  • @AgamRafaeli:它确实假设数组中至少有一个条目,因此如果该假设无效,var result... 行将变为 var result = my_array.length ? [my_array[0]] : []; :-)
【解决方案3】:

把我的帽子扔进去:

arr.map(x => [x, '~']).reduce((p, c) => p.concat(c));

这不是很hacky,它将每个元素映射为两个元素并将它们连接在一起,很容易概括:

const intercalate = (arr, sep) => arr.map(x => [x, sep])
                                     .reduce((p, c) => p.concat(c))
                                     .slice(0, -1);

或者使用单个reduce:

const intercalate = (arr, sep) => arr.reduce((p, c) => p.concat(c, sep)).slice(0, -1);

【讨论】:

  • 对于arr = [1,2,3],这将返回[1, "~", 2, "~", 3, "~"]。也许在最后添加 slice(0,-1) ?
【解决方案4】:

这是一个使用forEach的选项 -

var a = [1,2,3]
var sep = '~'
var b = []
a.forEach(function(x) { b.push(x, sep) })
b.pop() // remove the last `~`

【讨论】:

    【解决方案5】:

    使用_.flatMap

    var my_array = [1,2,3,4,5,6];
    var separator = '~';
    console.log(_.flatMap(my_array, function( v ){ return [v,separator] }).slice(0,-1));
    

    更新:

    确保删除尾随 ~

    【讨论】:

    • 这将留下尾随~
    【解决方案6】:

    使用传统的for 循环

    var nums = [1,2,3,4,5,6];
    var dash = '~';
    
    var res = [];
    for (var i=0; i<nums.length; i++){
      res.push(nums[i]);
      res.push(dash);
    }
    res.pop();
    
    console.log(res);

    【讨论】:

    • 这会导致 [1, "~", 2, "~", 3, "~", 4, "~", 5, "~", 6, "~" ] 其中想要的结果 [1, "~", 2, "~", 3, "~", 4, "~", 5, "~", 6]
    • 抱歉,已更正。
    【解决方案7】:

    您可以使用Array#reduce 并在必要时连接一个波浪号。

    var array = [1, 2, 3, 4, 5, 6],
        result = array.reduce(function (r, a, i) {
            return r.concat(i ? '~' : [], a);
        }, []);
        
    console.log(result);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    Array#forEach的另一个提议

    var array = [1, 2, 3, 4, 5, 6],
        result = [];
    
    array.forEach(function (a) {
       result.push(a, '~');
    });
    
    result.length--;
        
    console.log(result);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

    • 所有那些不必要的临时数组!!
    猜你喜欢
    • 2013-09-20
    • 1970-01-01
    • 2012-08-12
    • 2022-01-17
    • 2013-06-10
    • 1970-01-01
    • 1970-01-01
    • 2013-05-20
    • 2020-09-25
    相关资源
    最近更新 更多