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


Answers:



17

为了简单地使用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
daemonexmachina

更不用说,您的subarray方法会带来意想不到的结果。bigArr.slice(1,-1)返回['b','c','fd']您所期望的(-1将新数组的末尾的一个元素删除)。但bigArr.subarray(1,-1)回报率一样bigArr.subarray(1),这就是一切从位置1到年底bigArr。您还强迫用户始终给负数作为end参数。任何end >= -1给出的结果都与when相同end === undefined。另一方面,bigArr.slice(1,3)return ['b','c'],这也是预期的。
daemonexmachina

5

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); console.log(ar2)
波尔马特

0

问题是实实在在的一个新的数组,所以我认为一个更好的解决办法是结合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]


9
我认为切片不会更改原始数组。
玛尼(Mani)

10
Array.prototype.slice已返回副本。Array.prototype.splice修改原始数组。
Guido Bouman

2
slice()方法将数组的一部分的浅表副本返回到新的数组对象中。请参阅Mozilla开发人员网络。不赞成投票。
TheCrazyProgrammer

正如其他人所说,slice已经返回一个浅表副本,因此subarray不需要此实现。但也值得一提的是,您已经用猴子修补了内置对象,这是一个很大的禁忌。请参阅有关Abdennour TOUMI答案的评论。
daemonexmachina
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.