सरणी से सबर्रे कैसे प्राप्त करें?


263

मेरे पास var ar = [1, 2, 3, 4, 5]कुछ फ़ंक्शन है और चाहते हैं getSubarray(array, fromIndex, toIndex), कॉल getSubarray(ar, 1, 3)का परिणाम नई सरणी है [2, 3, 4]


10
क्या आपने स्लाइस की कोशिश की है ?
टॉम नॅपेन

जवाबों:


408

पर एक नज़र डालें 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);


22
यह शायद यहाँ स्पष्ट रूप से उल्लेख के लायक है कि मूल arअसम्बद्ध है। console.log(ar); // -> [1, 2, 3, 4, 5]
डेमोनेक्समाचीना

17

के एक साधारण उपयोग के लिए slice, ऐरे क्लास के लिए मेरे एक्सटेंशन का उपयोग करें:

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);

<["बी", "सी", "एफडी", "ज़ी"]

test2:

bigArr.subarray(2, -2);

<["सी", "एफडी"]

test3:

bigArr.subarray(2);

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

दूसरी भाषा (यानी ग्रूवी) से आने वाले डेवलपर्स के लिए आसान हो सकता है।



K_7 ने क्या कहा; सबसे विशेष रूप से, बंदर-निर्मित बिलिंग्स (ऑब्जेक्ट, एरे, प्रॉमिस, आदि) बहुत शरारती है। प्रस्तावित मूल का नाम बदलने के लिए MooTools का प्रसिद्ध उदाहरण देखें । Array.prototype.containsArray.prototype.includes
डेमोनएक्समैचिना

उल्लेख नहीं करने के लिए, आपकी subarrayविधि अप्रत्याशित परिणाम देती है। bigArr.slice(1,-1)रिटर्न ['b','c','fd'], जो आप उम्मीद करेंगे (-1 नए सरणी के अंत से एक तत्व को दस्तक देता है)। लेकिन bigArr.subarray(1,-1)उसी के रूप में लौटाता है bigArr.subarray(1), जो स्थिति 1 से अंत तक सब कुछ कहना है bigArr। आप उपयोगकर्ताओं को हमेशा endपैरामीटर के रूप में नकारात्मक संख्या देने के लिए मजबूर कर रहे हैं । कोई भी end >= -1जब जैसा परिणाम देता है end === undefined। दूसरी ओर, bigArr.slice(1,3)रिटर्न ['b','c'], जो फिर से होने की उम्मीद है।
डेमोनेक्समाचीना

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); कंसोल.लॉग (ar2)
बॉर्मैट

0

सवाल वास्तव में एक के लिए पूछ रहा है नई सरणी , इसलिए मेरा मानना है कि एक बेहतर समाधान गठबंधन करने के लिए किया जाएगा Abdennour Toumi का जवाब एक क्लोन समारोह के साथ:

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
मुझे नहीं लगता कि टुकड़ा मूल सरणी को बदल देगा।
मणि

10
Array.prototype.sliceपहले ही एक प्रति लौटाता है। Array.prototype.spliceमूल सरणी को संशोधित करता है।
गुइडो बोमन

2
टुकड़ा () विधि किसी सरणी के एक हिस्से की उथली प्रतिलिपि को एक नई सरणी वस्तु में वापस करती है। मोज़िला डेवलपर नेटवर्क देखें । Downvoted।
theCrazyProgrammer

जैसा कि दूसरों ने कहा है, sliceपहले से ही एक उथली प्रति लौटाता है, जिससे यह subarrayकार्यान्वयन अनावश्यक हो जाता है। लेकिन यह भी ध्यान देने योग्य बात है कि आपने एक बिलियन ऑब्जेक्ट को बंदर-पैच किया है, जो कि एक बड़ी संख्या में नहीं है। अब्देनॉर टुमी के उत्तर पर टिप्पणियाँ देखें ।
डेमोनेक्समाचीना
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.