如何从数组中获取子数组?

IT技术 javascript arrays
2021-01-23 13:56:01

我有var ar = [1, 2, 3, 4, 5]并想要一些函数getSubarray(array, fromIndex, toIndex),调用的结果getSubarray(ar, 1, 3)是新数组[2, 3, 4]

4个回答

看一眼 Array.slice(begin, end)

const ar  = [1, 2, 3, 4, 5];

// slice from 1..3 - add 1 as the end index is not included

const ar2 = ar.slice(1, 3 + 1);

console.log(ar2);

对不起,但是如果我尝试使用参数进行切片,那会引发某种“索引越界”错误怎么办?在这个例子中,想象我会去ar.slice(4, 4);吗?我想我应该试试 :x..
2021-03-14 13:56:01
此处可能值得明确提及原件ar未经修改。 console.log(ar); // -> [1, 2, 3, 4, 5]
2021-03-26 13:56:01
另外,不要犯将slice()方法与splice():splice()更改原始数组而slice()不会混淆的错误
2021-04-11 13:56:01

对于 的简单使用slice,请使用我对 Array Class 的扩展:

Array.prototype.subarray = function(start, end) {
    if (!end) { end = -1; } 
    return this.slice(start, this.length + 1 - (end * -1));
};

然后:

var bigArr = ["a", "b", "c", "fd", "ze"];

测试1

bigArr.subarray(1, -1);

< ["b", "c", "fd", "ze"]

测试2:

bigArr.subarray(2, -2);

< ["c", "fd"]

测试3:

bigArr.subarray(2);

< ["c", "fd","ze"]

对于来自另一种语言(即 Groovy)的开发人员来说可能更容易。

K_7 所说的;最特别的是,猴子修补内置函数(对象、数组、Promise 等)非常顽皮。请参阅著名的MooTools示例,该示例强制将建议的本机重命名Array.prototype.containsArray.prototype.includes.
2021-03-21 13:56:01
更不用说,您的subarray方法会产生意想不到的结果。bigArr.slice(1,-1)返回['b','c','fd'],这是您所期望的(-1 从新数组的末尾敲出一个元素)。bigArr.subarray(1,-1)回报率一样bigArr.subarray(1),这就是一切从位置1到年底bigArr您还强迫用户始终提供负数作为end参数。Anyend >= -1给出与 when 相同的结果end === undefined另一方面,bigArr.slice(1,3)返回['b','c'],这也是意料之中的。
2021-04-02 13:56:01
2021-04-04 13:56:01

const array_one = [11, 22, 33, 44, 55];
const start = 1;
const end = array_one.length - 1;
const array_2 = array_one.slice(start, end);
console.log(array_2);

它不会在这里编译更正: var array_one = [11, 22, 33, 44,55]; var ar2 = array_one.slice(0, array_one.length-1); 控制台日志(ar2)
2021-03-28 13:56:01

问题是实实在在的一个新的数组,所以我认为一个更好的解决办法是结合Abdennour•图米的答案与克隆功能:

function clone(obj) {
  if (null == obj || "object" != typeof obj) return obj;
  const copy = obj.constructor();
  for (const attr in obj) {
    if (obj.hasOwnProperty(attr)) copy[attr] = obj[attr];
  }
  return copy;
}

// With the `clone()` function, you can now do the following:

Array.prototype.subarray = function(start, end) {
  if (!end) {
    end = this.length;
  } 
  const newArray = clone(this);
  return newArray.slice(start, end);
};

// Without a copy you will lose your original array.

// **Example:**

const array = [1, 2, 3, 4, 5];
console.log(array.subarray(2)); // print the subarray [3, 4, 5, subarray: function]

console.log(array); // print the original array [1, 2, 3, 4, 5, subarray: function]

[ http://stackoverflow.com/questions/728360/most-elegant-way-to-clone-a-javascript-object]

正如其他人所说,slice已经返回一个浅拷贝,使得这个subarray实现变得不必要。但还值得一提的是,您已经修补了一个内置对象,这是一个很大的禁忌。请参阅对Abdennour TOUMI 的回答的评论
2021-03-14 13:56:01
slice() 方法将数组的一部分的浅拷贝返回到新的数组对象中。请参阅Mozilla 开发者网络投反对票。
2021-03-28 13:56:01
我不认为切片会改变原始数组。
2021-04-07 13:56:01
Array.prototype.slice已经返回一个副本。Array.prototype.splice修改原始数组。
2021-04-11 13:56:01