将数组分成两个数组

82
var arr = ['a', 'b', 'c', 'd', 'e', 'f'];
var point = 'c';

如何根据“point”变量将“arr”拆分为两个数组,例如:

['a', 'b']

['d', 'e', 'f']

我用了两次迭代和一些临时变量,但我希望有一种更快的方法和更少的代码... - ellabeauty
数组总是由单个字符字符串组成吗? - calebds
我建议您编写一个函数,根据“point”变量拆分数组。 - Michal B.
你的问题缺乏明确性:例如,该数组是否保证按排序顺序排列?还是我们只是在寻找分裂点值的第一个实例并在其上进行分割? - ControlAltDel
2
我建议使用 indexOf 然后跟着 slice - zzzzBov
@bernie 代码已经在那里了,问题也很清楚。原帖作者只是不知道可以使用哪些方法来完成他们需要的操作。 - Ruan Mendes
10个回答

65
var arr2 = ['a', 'b', 'c', 'd', 'e', 'f'];
arr = arr2.splice(0, arr2.indexOf('c'));
从arr2中移除“c”:
```html

要从arr2中移除'c':

```
arr2.splice(0,1);

arr包含前两个元素,arr2包含后三个元素。

这做了一些假设(比如arr2始终包含在第一次赋值中的'point'),因此需要根据需要添加一些边界情况的正确性检查。


实际上应该是 arr2.indexOf('c') + 1 - Jon
至少对于这个特定的情况,问题已经解决了。 - ramblinjan
你可以如何在 Ruby 中做到这件相同的事情? - Sam P

41

使用indexOfslice

var arr = ['a', 'b', 'c', 'd', 'e', 'f'];

var indexToSplit = arr.indexOf('c');
var first = arr.slice(0, indexToSplit);
var second = arr.slice(indexToSplit + 1);

console.log({first, second});


6
“end”索引是不包含在内的(与包含式的“start”相反),因此应该是“second = arr.slice(indexToSplit);”(不需要添加1)。 - Tomasz Gawel
1
@TomaszGawel 我不确定你的意思,这个输出了OP所要求的结果,也就是说,他们不想在任何一个数组中找到匹配项。 - Ruan Mendes

33

在访问了这个页面后,我制作了这个便利函数,现在分享给大家。

function chunkArray(arr,n){
     var chunkLength = Math.max(arr.length/n ,1);
     var chunks = [];
     for (var i = 0; i < n; i++) {
         if(chunkLength*(i+1)<=arr.length)chunks.push(arr.slice(chunkLength*i, chunkLength*(i+1)));
     }
     return chunks; 
 }

使用示例:

chunkArray([1,2,3,4,5,6],2);
//returns [[1,2,3],[4,5,6]]

chunkArray([1,2,3,4,5,6,7],2);
//returns [[1,2,3],[4,5,6,7]]

chunkArray([1,2,3,4,5,6],3);
//returns [[1,2],[3,4],[5,6]]

chunkArray([1,2,3,4,5,6,7,8],3);
//returns [[1,2],[3,4,5],[6,7,8]]

chunkArray([1,2,3,4,5,6,7,8],42);//over chunk
//returns [[1],[2],[3],[4],[5],[6],[7],[8]]

1
这是一个很棒的答案!谢谢。 - SwankyLegg
在JavaScript中,var不是正确的选择,现代JS代码应该使用let,并且您可以使用转译器来支持旧版浏览器。此外,那个if语句中根本没有空格。 - Corman

11

试试这个:

var arr = ['a', 'b', 'c', 'd', 'e', 'f'];
var point = 'c';

var idx = arr.indexOf(point);

arr.slice(0, idx) // ["a", "b"]
arr.slice(idx + 1) // ["d", "e", "f"]

4
var arr = ['a', 'b', 'c', 'd', 'e', 'f'];
var point = 'c';
Array.prototype.exists = function(search){
    for (var i=0; i<this.length; i++) {
        if (this[i] == search) return i;
    }
    return false;
} 

if(i=arr.exists(point))
{
    var neewArr=arr.splice(i);
    neewArr.shift(0);

    console.log(arr); // output: ["a", "b"]
    console.log(neewArr); // output: ["d", "e", "f"] 
}​

Here is an example.


1
你的“exists”函数已经存在,它叫做“indexOf”。 - Ruan Mendes

2
var arr = ['a', 'b', 'c', 'd', 'e', 'f'];
var point = 'c';
var i = arr.indexOf(point);
var firstHalf, secondHalf, end, start;

if (i>0) {
  firstHalf = arr.slice(0, i);
  secondHalf = arr.slice(i + 1, arr.length);    
}

//这应该可以让你开始了。你能想到哪些边缘情况需要测试以进行修复吗? //当点在数组的开头或结尾时会发生什么?


1
当分割数组时,您需要创建两个新数组,这些数组将包括您要分割的内容,例如 arr1 和 arr2。为了填充这些数组,您需要执行类似以下的操作:
var arr1, arr2; // new arrays
int position = 0; // start position of second array
   for(int i = 0; i <= arr.length(); i++){
       if(arr[i] = point){ //when it finds the variable it stops adding to first array
           //starts adding to second array
            for(int j = i+1; j <= arr.length; j++){
               arr2[position] = arr[j];
               position++; //because we want to add from beginning of array i used this variable
            }
       break;
       }
      // add to first array
       else{
           arr1[i] = arr[i];
       }
}

有不同的方法可以做到这一点!祝你好运!


0

如果你想要将其分成相等的两半,为什么不使用简单的 while 循环呢?

var arr = ['a', 'b', 'c', 'd', 'e', 'f'];
var c=[];
while(arr.length > c.length){
 c.push(arr.splice(arr.length-1)[0]);
}

砰!:)


0

使用给定的数组元素将两个数组分开,一个为字符串数组,另一个为数字数组;

let arr = [21,'hh',33,'kk',55,66,8898,'rtrt'];


arrStrNum = (arr) => {
    let str = [],num = [];

    for(let i = 0;i<arr.length;i++){
        if(typeof arr[i] == "string"){
            str.push(arr[i]);
        }else if(typeof arr[i] == "number"){
            num.push(arr[i]);
        }
    }
    return [str, num]
    }

let ans = arrStrNum(arr);
let str = ans[0];
let num = ans[1];
console.log(str);
console.log(num);

请编辑您的答案并添加一些文本说明:为什么以及如何工作,为什么与其他给出的答案不同。 - ahuemmer

0

另一个建议:

var segments = arr.join( '' ).split( point ).map(function( part ) {
    return part.split( '' );
});

现在segments包含一个数组的数组:

[["a", "b"], ["d", "e", "f"]]

并且可以像这样访问

segments[ 0 ]; // ["a", "b"]
segments[ 1 ]; // ["d", "e", "f"]

3
如果该数组包含类似于“abc”的内容,那么这将失败。 - Ruan Mendes
@JuanMendes:不是很确定。你为什么这么认为? - jAndy
@JuanMendes:哦...你的意思是使用修改后的数组结构。是的,我在这里假设原始数组具有这个确切的结构。 - jAndy
我的评论非常明确,这不会起作用,“如果数组包含'abc'”。我没有踩,可能是点赞了我的评论的人。 - Ruan Mendes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接