सीमाओं को फिर से व्यवस्थित करना


98

कहो, मेरे पास एक सरणी है जो इस तरह दिखता है:

var playlist = [
    {artist:"Herbie Hancock", title:"Thrust"},
    {artist:"Lalo Schifrin", title:"Shifting Gears"},
    {artist:"Faze-O", title:"Riding High"}
];

मैं एक तत्व को दूसरी स्थिति में कैसे स्थानांतरित कर सकता हूं?

मैं उदाहरण के लिए, {artist:"Lalo Schifrin", title:"Shifting Gears"}अंत तक जाना चाहता हूं ।

मैंने ब्याह का उपयोग करने की कोशिश की, जैसे:

var tmp = playlist.splice(2,1);
playlist.splice(2,0,tmp);

लेकिन यह काम नहीं करता है।


3
"काम नहीं करता" का क्या अर्थ है - क्या यह एक त्रुटि फेंकता है, क्या यह कुछ भी नहीं बदलता है, क्या यह आपके सरणी को उस तरह से बदलता है जैसा आपने इरादा नहीं किया था? यह मुझे उचित लगता है।
जैकब मैटीसन

जवाबों:


220

का सिंटैक्स Array.spliceहै:

yourArray.splice(index, howmany, element1, /*.....,*/ elementX);

कहाँ पे:

  • अनुक्रमणिका उस स्थिति की स्थिति है, जिसमें आप उन तत्वों को हटाना चाहते हैं, जिनसे आप तत्वों को निकालना चाहते हैं
  • howmany कितने तत्वों को आप इंडेक्स से हटाना चाहते हैं
  • एलिमेंट 1, ..., एलिमेंट एक्सएक्सएक्स वे तत्व हैं जिन्हें आप स्थिति इंडेक्स से सम्मिलित करना चाहते हैं ।

इसका मतलब यह है कि splice()आपके द्वारा पास किए गए तर्कों के आधार पर तत्वों को हटाने, तत्वों को जोड़ने या किसी सरणी में तत्वों को बदलने के लिए उपयोग किया जा सकता है।

ध्यान दें कि यह हटाए गए तत्वों की एक सरणी देता है।

कुछ अच्छा और सामान्य होगा:

Array.prototype.move = function (from, to) {
  this.splice(to, 0, this.splice(from, 1)[0]);
};

तो बस का उपयोग करें:

var ar = [1,2,3,4,5];
ar.move(0,3);
alert(ar) // 2,3,4,1,5

चित्र:

एल्गोरिथम आरेख


17
यह एक अच्छा उत्तर है, और एक ब्याह () के भीतर विभाजन () काम अच्छी तरह से करता है। हालांकि, यह ध्यान दिया जाना चाहिए कि ऐरे प्रोटोटाइप के लिए एक कदम () पद्धति को जोड़ना "मंकी पैचिंग" है और आमतौर पर बुरा अभ्यास है। stackoverflow.com/questions/5741877/…
आरोन सिकलि

20

यदि आप जानते हैं कि इंडेक्स आप आसानी से तत्वों को स्वैप कर सकते हैं, तो इस तरह से एक साधारण फ़ंक्शन के साथ:

function swapElement(array, indexA, indexB) {
  var tmp = array[indexA];
  array[indexA] = array[indexB];
  array[indexB] = tmp;
}

swapElement(playlist, 1, 2);
// [{"artist":"Herbie Hancock","title":"Thrust"},
//  {"artist":"Faze-O","title":"Riding High"},
//  {"artist":"Lalo Schifrin","title":"Shifting Gears"}]

एरे इंडेक्स सिर्फ एरे ऑब्जेक्ट के गुण हैं, जिससे आप इसके मान को स्वैप कर सकते हैं।


धन्यवाद, @CMS। अगर मैं स्वैप का मतलब ऑर्डर बदलना नहीं चाहता ... उदाहरण के लिए, अगर मैं 1 सेंट की स्थिति के लिए 3 ऑब्जेक्ट का चयन करता हूं तो मैं 1 को 2 और 2 को 3 के रूप में 1
पेरी

13

यहाँ उन लोगों के लिए एक अपरिवर्तनीय संस्करण है जो रुचि रखते हैं:

function immutableMove(arr, from, to) {
  return arr.reduce((prev, current, idx, self) => {
    if (from === to) {
      prev.push(current);
    }
    if (idx === from) {
      return prev;
    }
    if (from < to) {
      prev.push(current);
    }
    if (idx === to) {
      prev.push(self[from]);
    }
    if (from > to) {
      prev.push(current);
    }
    return prev;
  }, []);
}

नमस्ते, क्या आप मुझे ऊपर के उत्तर पर इस समारोह के लाभों की व्याख्या कर सकते हैं?
Xogno

1
यह समाधान मूल तत्व को संशोधित नहीं करता है, लेकिन प्रविष्टि को स्थानांतरित करने के साथ एक नया सरणी देता है।
चिम्मी

7

तत्व को हटाते समय ब्याह कॉल में पहले पैरामीटर के रूप में 2 से 1 बदलें:

var tmp = playlist.splice(1, 1);
playlist.splice(2, 0, tmp[0]);

1
यह प्लेलिस्ट होना चाहिए ।plice (2,0, tmp [0]); सही?
क्रिस्बूट

7

ES6 के साथ आप कुछ इस तरह से कर सकते हैं:

const swapPositions = (array, a ,b) => {
  [array[a], array[b]] = [array[b], array[a]]
}

let array = [1,2,3,4,5];
swapPositions(array,0,1);

/// => [2, 1, 3, 4, 5]

1
इससे दो तत्व की स्थिति बदल जाती है। प्रश्न फिर से के लिए है।
द्वारा

5

आप हमेशा सॉर्ट विधि का उपयोग कर सकते हैं, यदि आपको नहीं पता कि वर्तमान में रिकॉर्ड कहां है:

playlist.sort(function (a, b) {
    return a.artist == "Lalo Schifrin" 
               ? 1    // Move it down the list
               : 0;   // Keep it the same
});

किस बारे मेंreturn +(a.artist == "Lalo Schifrin")
फंककोडैट

2
@Funko आप ऐसा कर सकते हैं, अगर आप वर्बोसिटी पर संक्षिप्तता पसंद करते हैं।
एंडी ई

2

संपादित करें: कृपया एंडी के जवाब की जांच करें क्योंकि उनका जवाब पहले आया था और यह पूरी तरह से उसका विस्तार है

मुझे पता है कि यह एक पुराना सवाल है, लेकिन मुझे लगता है कि इसे शामिल करने लायक है Array.prototype.sort()

यहाँ लिंक के साथ MDN से एक उदाहरण है

var numbers = [4, 2, 5, 1, 3];
numbers.sort(function(a, b) {
  return a - b;
});
console.log(numbers);

// [1, 2, 3, 4, 5]

सौभाग्य से यह केवल संख्या के साथ काम नहीं करता है:

arr.sort([compareFunction])

compareFunction

एक फ़ंक्शन निर्दिष्ट करता है जो सॉर्ट क्रम को परिभाषित करता है। यदि छोड़ दिया जाता है, तो प्रत्येक तत्व के स्ट्रिंग रूपांतरण के अनुसार, प्रत्येक वर्ण के यूनिकोड कोड बिंदु मान के अनुसार सरणी को सॉर्ट किया जाता है।

मैंने देखा कि आप उन्हें पहले नाम से आदेश दे रहे हैं:

let playlist = [
    {artist:"Herbie Hancock", title:"Thrust"},
    {artist:"Lalo Schifrin", title:"Shifting Gears"},
    {artist:"Faze-O", title:"Riding High"}
];

// sort by name
playlist.sort((a, b) => {
  if(a.artist < b.artist) { return -1; }
  if(a.artist > b.artist) { return  1; }

  // else names must be equal
  return 0;
});

नोट आप करने के लिए है कि यदि आप अंतिम नाम से उन्हें ऑर्डर करना चाहता था या तो दोनों के लिए एक महत्वपूर्ण है first_nameऔर last_nameया कर कुछ regex जादू है, जो मैं एक्सडी ऐसा नहीं कर सकते

उम्मीद है की वो मदद करदे :)


यह इस उत्तर पर संपादित या टिप्पणी करने के लिए होना चाहिए ।
जारेड स्मिथ

@JaredSmith ओह! मैंने उसका जवाब नहीं देखा। मेरे पास पर्याप्त अंक नहीं हैं या उसके प्रश्न को संपादित करने के लिए जो भी हो, और मुझे नहीं लगता कि इस जानकारी को एक टिप्पणी में जोड़ा जाना चाहिए। इसलिए जब तक कोई अपने सवाल को संपादित नहीं करता है, मैं बस यही जोड़ूंगा कि यह एंडी ई के जवाब का विस्तार है (जैसे मुझे किया जाना चाहिए)।
जैको टोरस

मुझे लगता है कि यह अब ठीक है :)
जेरेड स्मिथ

1

इसे इस्तेमाल करे:

playlist = playlist.concat(playlist.splice(1, 1));

1

यदि आप केवल किसी आइटम को मनमाने स्थान से सरणी के अंत तक ले जाना चाहते हैं, तो यह काम करना चाहिए:

function toEnd(list, position) {
    list.push(list.splice(position, 1));
    return list;
}

यदि आप कई वस्तुओं को कुछ मनमाने स्थिति से अंत तक ले जाना चाहते हैं, तो आप ऐसा कर सकते हैं:

function toEnd(list, from, count) {
    list.push.apply(list, list.splice(from, count));
    return list;
}

यदि आप कई वस्तुओं को मनमाने स्थान से कुछ मनमाने स्थान पर ले जाना चाहते हैं, तो कोशिश करें:

function move(list, from, count, to) {
    var args = [from > to ? to : to - count, 0];
    args.push.apply(args, list.splice(from, count));
    list.splice.apply(list, args);

    return list;
}

0

एक सरल परिवर्तनशील समाधान के रूप में आप दो बार एक पंक्ति में दो बार कॉल कर सकते हैं:

playlist.splice(playlist.length - 1, 1, ...playlist.splice(INDEX_TO_MOVE, 1))

दूसरी ओर, एक सरल अयोग्य समाधान स्लाइस का उपयोग कर सकता है क्योंकि यह विधि इसे बदलने के बिना मूल सरणी से एक अनुभाग की एक प्रति लौटाती है:

const copy = [...playlist.slice(0, INDEX_TO_MOVE - 1), ...playlist.slice(INDEX_TO_MOVE), ...playlist.slice(INDEX_TO_MOVE - 1, INDEX_TO_MOVE)]

-2

इस तरह से अपने काम को फिर से चलाएं

 var tmpOrder = playlist[oldIndex];
    playlist.splice(oldIndex, 1);
    playlist.splice(newIndex, 0, tmpOrder);

मुझे उम्मीद है कि यह काम करेगा


1
यह मौजूदा उत्तरों पर क्या प्रभाव डालता है?
जारेड स्मिथ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.