无论大小如何,将阵列拼成两半?

Xti*_*ian 34 javascript arrays

我有一个阵列,我想分成两半.所以我可以将前半部分放在右侧,将后半部分放在左侧.

我之前使用过拼接功能:

var leftSide = arrayName.splice(0,2);
Run Code Online (Sandbox Code Playgroud)

但不确定无论大小如何将其拼接成一半,因为数组的大小会动态变化.

red*_*777 59

var half_length = Math.ceil(arrayName.length / 2);    

var leftSide = arrayName.splice(0,half_length);
Run Code Online (Sandbox Code Playgroud)

在Orbit评论中编辑了@Lightness Races之后的代码

  • `Math.ceil(arrayName.length/2)`可以代替代码的七行和三行,并避免污染全局范围来启动. (2认同)

Joe*_*oyd 33

避免突变

如果您需要避免突变,例如,如果您必须拆分数组,您不想改变原始数据,或者它可能会导致您的应用程序中出现一些非常奇怪的行为.

使用切片

你可以通过使用slice而不是来解决这个问题splice

let yourArray = props.someArray;
let halfwayThrough = Math.floor(yourArray.length / 2)
// or instead of floor you can use ceil depending on what side gets the extra data

let arrayFirstHalf = yourArray.slice(0, halfwayThrough);
let arraySecondHalf = yourArray.slice(halfwayThrough, yourArray.length);
Run Code Online (Sandbox Code Playgroud)

  • 最后一个“yourArray.length”不是必需的。“直到最后”[默认](https://www.w3schools.com/jsref/jsref_slice_array.asp) (2认同)

jfr*_*d00 17

您可以简单地引用数组的长度:

var leftSide = arrayName.splice(0, Math.floor(arrayName.length / 2));
Run Code Online (Sandbox Code Playgroud)

由于.splice()实际上从源数组中删除了元素,因此数组中的其余元素将是右半部分的元素.

Math.floor()将向下舍入,使左侧比奇数长度小一侧.你可以使用,Math.ceil()如果你想要向上舍入,当长度为奇数时,左侧比右侧多一个.


Pra*_*rya 6

您还可以使用 ES6 解构和slice(),这样原始数组就不会被改变。

   const yourArray;
   let leftSide,rightSide;
   const m = Math.floor(yourArray.length/2);
   const [leftSide,rightSide] = [yourArray.slice(0,m), yourArray.slice(m,yourArray.length)];
   console.log(leftSide);
   console.log(rightSide);
Run Code Online (Sandbox Code Playgroud)


Non*_*eSL 5

let leftSide = myArray.splice(0, Math.ceil(myArray.length / 2));
//The right side is stored in "myArray"
Run Code Online (Sandbox Code Playgroud)

例如:

let letters = ['a', 'b', 'c', 'd', 'e'];
let leftSide = letters.splice(0, Math.ceil(letters.length /2));
let rightSide = letters;
console.log(leftSide);
=> ['a', 'b', 'c']
console.log(rightSide);
=> ['d', 'e']
Run Code Online (Sandbox Code Playgroud)

更多信息: splice在 MDN 文档中


请注意,这会修改您的原始数组。如果要保留原始数组,请克隆该数组,然后对克隆的数组使用 splice。来自一个关于克隆数组的问题

有一个巨大的 BENCHMARKS 线程,提供以下信息:

  • 对于 Blink 浏览器,slice() 是最快的方法,concat() 有点慢,而 while 循环慢 2.4 倍。

  • 对于其他浏览器, while 循环是最快的方法,因为这些浏览器没有对切片和连接进行内部优化。

//Fastest for Blink browsers (Opera/Chromium):
let clonedArray = originalArray.slice();
//For other browsers:
let clonedArray = [];
var i = myArray.length;
while (i--) clonedArray[i] = myArray[i];
Run Code Online (Sandbox Code Playgroud)


Pen*_*Liu 5

看看 lodash chunk

var myArray = [1, 2, 3, 4, 5, 6, 7, 8];
var pivot = _.ceil(myArray.length / 2);
// => 4
console.log(_.chunk(myArray, pivot));
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>
Run Code Online (Sandbox Code Playgroud)