Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 组合一些数组项_Javascript_Arrays_Functional Programming - Fatal编程技术网

Javascript 组合一些数组项

Javascript 组合一些数组项,javascript,arrays,functional-programming,Javascript,Arrays,Functional Programming,我对函数式编程有点陌生,我尝试做以下工作:假设我有一个值数组:['a','b-','c'],我希望每个以'-'结尾的项都与以下数组项合并:['a','b-c'] 当然,我可以通过创建for循环来实现这一点: var测试=['a','b-','c'],结果=[]; 对于(var i=0;i来说,老实说,编程的方式可能是最有效的方式 但是,这里还有另一个选择: var测试=['a','b-','c'], 结果=test.join().replace(/-,/g',).split(','); con

我对函数式编程有点陌生,我尝试做以下工作:假设我有一个值数组:
['a','b-','c']
,我希望每个以
'-'
结尾的项都与以下数组项合并:
['a','b-c']

当然,我可以通过创建for循环来实现这一点:

var测试=['a','b-','c'],结果=[];

对于(var i=0;i来说,老实说,编程的方式可能是最有效的方式

但是,这里还有另一个选择:

var测试=['a','b-','c'],
结果=test.join().replace(/-,/g',).split(',');
console.log(结果);
一种可能的方法(使用
.reduce
):


这也可以通过以下方式实现:


这种方法适用于一行中的多个虚线元素,如果最后一个元素有虚线,则使用
Array.forEach

var test = ['a', 'b-', 'c-'], result = [], next = "";

test.forEach(function(curr) {
  if (curr.endsWith('-')) {
    next += curr;
    if (curr == test[test.length-1]) {
      result.push(next);
    }
 }else {
   result.push(next + curr);
   next = "";
 }
});
document.write(result);

另一个
映射
+
过滤器
一个。很可能较慢,因为过滤器在数组中添加了另一个迭代,但工作方式与原始的一样(当一行中有多个-,这可能不是OP想要的)

var测试=['a'、'b-'、'c-'、'd'、'e'],结果=[];
结果=测试
.map((curr,i,array)=>(curr.endsWith('-')和&array[i+1]!==未定义)?curr+array[i+1]:curr)
.filter((curr,i,arr)=>(i>0&&arr[i-1]。长度>1&&curr.length==1)?false:true)

记录。写(结果);
没有阅读所有答案,所以如果我重复已经说过的话,请原谅

函数式编程并不意味着总是有一个预定义的函数可以完全实现您想要的功能;或者是一些函数的组合。
有时,编写一个简单的短实用函数比滥用已有的函数要好

一些“问题”如相邻的多个虚线值或列表末尾的虚线值如何?您希望如何处理这些情况?
这将是我的实施:

function combineDashedStrings(arr){
    var result = [], pending = ""
    for (var i=0; i<arr.length; i++) {
        var curr = pending + arr[i];

        pending = curr.endsWith("-") && curr || "";                 //multiple concats
        //pending = !pending && curr.endsWith("-") && curr || "";   //single concat

        pending || result.push(curr);
    }
    //pending && result.push(curr); //add last item if it contains a dash
    return result
}

combineDashedStrings(['a', 'b-', 'c-', 'd', 'e-']);
函数组合显示字符串(arr){
var result=[],pending=“”

for(var i=0;我想我会使用reduce,但是for循环有什么问题(尽管我认为代码中存在一些边界情况问题,比如最后一个元素有最后一个破折号)。如果有多个项目带有破折号,或者一个元素包含一个破折号,后跟一个逗号,等等,这将不起作用。@torazaburo:现在有;-)如果数组中的值包含一个
@WillemdeWit:我更新了一点答案。你可以使用任何适合你的分隔符。
…替换(/-\\\\\\\\\\\\\\\\\\/g,'-')。
当你使用
映射时,
[“a”,“b-c”,undefined×1],结果将包含尾部
未定义的
元素
。这意味着
result.length==3
。此外,
test
(即,输入数组)也被修改。不完全如此。
result.length
仍然是
3
。请注意
console.log(result)
不会将未定义的元素记录在数组的末尾,但尝试记录
长度
,或者在控制台中输入
结果
。使用
a.splice
会变异输入数组。不要这样做!@Bergi:
a
是输入数组的副本。(
test.slice()
)您可以使用
过滤器(布尔值)
而不是
.filter(函数(x){return x;});
建议:
str[str.length-1]=='-'
哦,现在我明白了。
acc
是数组。我喜欢这个答案,因为它不使用闭包。那么,什么答案使用闭包呢?那么,这会返回OP的尝试也返回的错误结果?@Cerbrus我不确定OP是想要['a'、'b-c-d']还是['a'、'b-c-'、'c-d']来表示['a','b-'、'c-'、'd']。如果是第二种情况,那么上面的代码片段就是工作的起点。我建议使用
for
循环,因为这很可能是最有效的方法。不要滥用
map
作为循环。如果你不想得到结果,至少使用
forEach
这样就很清楚了。
返回结果
而不是
返回arr。发布前测试代码。
var test = ['a', 'b-', 'c-'], result = [], next = "";

test.forEach(function(curr) {
  if (curr.endsWith('-')) {
    next += curr;
    if (curr == test[test.length-1]) {
      result.push(next);
    }
 }else {
   result.push(next + curr);
   next = "";
 }
});
document.write(result);
function combineDashedStrings(arr){
    var result = [], pending = ""
    for (var i=0; i<arr.length; i++) {
        var curr = pending + arr[i];

        pending = curr.endsWith("-") && curr || "";                 //multiple concats
        //pending = !pending && curr.endsWith("-") && curr || "";   //single concat

        pending || result.push(curr);
    }
    //pending && result.push(curr); //add last item if it contains a dash
    return result
}

combineDashedStrings(['a', 'b-', 'c-', 'd', 'e-']);