在JavaScript中,根据索引将数组拆分为两个。

68

我有一个包含对象列表的数组。我想在特定索引处(例如4,这个值实际上是一个变量)将此数组拆分,然后将拆分后的第二部分存储到另一个数组中。可能很简单,但我无法想到一个好的方法来完成这个任务。

8个回答

111

使用 slice 方法,如下:

var ar = [1,2,3,4,5,6];

var p1 = ar.slice(0,4);
var p2 = ar.slice(4);

4
数组长度不足时会发生什么?例如对于数组 [1,2.3],执行 slice(4) 会怎样? - Xanlantos
@Xanlantos它将返回一个与原始数组完全相同的数组。 - Kyle Soeltz
@KyleSoeltz 我认为这是不准确的,实际上它返回一个空数组。我刚刚测试过了。这种行为对我来说似乎更可取。 - Zain Syed
1
@ZainSyed 是的,你说得对。我误读了问题,并想到了 [1,2,3].slice(0,4),它将返回一个相同的数组。[1,2,3].slice(4) 将返回一个空数组。 - Kyle Soeltz

27

您可以使用 Array@splice 方法将数组中指定索引后的所有元素从数组末尾删除并返回它们:

x = ["a", "b", "c", "d", "e", "f", "g"];
y = x.splice(3);
console.log(x); // ["a", "b", "c"]
console.log(y); // ["d", "e", "f", "g"]

6
我建议使用如下方法进行切片: ar.slice(startIndex,length); 或者 ar.slice(startIndex); 这两种方法都是针对数组进行的操作,可以根据需要选择是否指定返回的元素个数。

var ar = ["a","b","c","d","e","f","g"];

var p1 = ar.slice(0,3);
var p2 = ar.slice(3);

console.log(p1);
console.log(p2);


5

use slice:

var bigOne = [0,1,2,3,4,5,6];
var splittedOne = bigOne.slice(3 /*your Index*/);

1

const splitAt = (i, arr) => {
  const clonedArray = [...arr];
  return [clonedArray.splice(0, i), clonedArray];
}

const [left, right] = splitAt(1, [1,2,3,4])

console.log(left) // [1]
console.log(right) // [2,3,4]


const [left1, right1] = splitAt(-1, [1,2,3,4])

console.log(left1) // []
console.log(right1) // [1,2,3,4]


const [left2, right2] = splitAt(5, [1,2,3,4])

console.log(left1) // [1,2,3,4]
console.log(right1) // []

与其他解决方案相比,它的一些优点是:

  1. 你可以用一行代码得到结果。
  2. 当分割索引超出范围时,结果仍然正确。 slice 将无法正确工作。
  3. 它不会改变原始数组。某些基于 splice 的解决方案可能会改变原始数组。
  4. 只有 1 个 splice 操作,而不是 2 个 slice 操作。但你需要进行基准测试以查看是否存在实际性能差异。

0

来自lodash的简单函数: const mainArr = [1,2,3,4,5,6,7] const [arr1, arr2] = _.chunk(mainArr, _.round(mainArr.length / 2));


0

const splitArrayByIndex = (arr, index) => {
  if (index > 0 && index < arr.length) {
    return [arr.slice(0, index), arr.slice(-1 * (arr.length - index))]
  }
}

const input = ['a', 'x', 'c', 'r']
const output = splitArrayByIndex(input, 2)

console.log({ input, output })


0

你也可以使用underscore/lodash包装器:

var ar = [1,2,3,4,5,6];
var p1 = _.first(ar, 4);
var p2 = _.rest(ar, 4);

3
_.first_.head的别名,不接受第二个参数。https://lodash.com/docs/4.17.4#first - jelder

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