একটি নির্দিষ্ট সূচক (জাভাস্ক্রিপ্ট) এ অ্যারেতে কোনও আইটেমটি কীভাবে সন্নিবেশ করা যায়?


2929

আমি একটি জাভাস্ক্রিপ্ট অ্যারে সন্নিবেশ পদ্ধতির সন্ধান করছি, এর স্টাইলে:

arr.insert(index, item)

সাধারণত jQuery এ, তবে যে কোনও জাভাস্ক্রিপ্ট বাস্তবায়ন এই মুহুর্তে করবে।


95
নোট করুন যে জিকুয়ারি একটি ডিওএম এবং ইভেন্ট ম্যানিপুলেশন লাইব্রেরি, এটি নিজস্ব নিজস্ব ভাষা নয়। অ্যারে হেরফেরের সাথে এর কোনও যোগসূত্র নেই।
ডোমিনো

25
api.jquery.com/jQuery.in অ্যারির ডিওএম বা ইভেন্টগুলির সাথে কোনও সম্পর্ক নেই। ব্রাউজার জেএস বিকাশের জন্য jQuery একটি মিশ্র টুলকিট হিসাবে বিকশিত হয়েছে, যার ফলে সমস্ত কিছুর জন্য একটি পদ্ধতি রয়েছে বলে লোকেদের প্রত্যাশা করে।
টিম

4
@ টিম, তবে এটি এখনও নিজস্ব নিজস্ব ভাষা নয় (এখনও এখানে "জিকুয়রিতে দুটি সংখ্যার যোগফল কীভাবে হবে" এর মতো কিছু প্রশ্ন রয়েছে)
ভিক্টর

3
@ ভিক্টর না, এবং কখনই হবে না। jQuery দরকারী এবং প্রাসঙ্গিক ছিল, কিন্তু এটির দিনটি ছিল।
টিম

1
এছাড়াও, দেখতে এই : একটি পাকান বিস্ময় (জন্য,
noobie

উত্তর:


4750

আপনি যা চান তা হ'ল spliceনেটিভ অ্যারে অবজেক্টের ফাংশন।

arr.splice(index, 0, item);ঢোকাব itemমধ্যে arrনির্দিষ্ট সূচিতে (মোছার 0প্রথম আইটেম, যে, এটা ঠিক একটি সন্নিবেশ আছে)।

এই উদাহরণে আমরা একটি অ্যারে তৈরি করব এবং এর সাথে সূচি 2 তে একটি উপাদান যুক্ত করব:

var arr = [];
arr[0] = "Jani";
arr[1] = "Hege";
arr[2] = "Stale";
arr[3] = "Kai Jim";
arr[4] = "Borge";

console.log(arr.join());
arr.splice(2, 0, "Lene");
console.log(arr.join());


168
ধন্যবাদ, আমি ভেবেছিলাম জিজ্ঞাসা করার জন্য আমি বোকা বোধ করব তবে এখন আমি জানি না উত্তরটি আমি জানি না! যখন আরও অনুসন্ধানযোগ্য পদ একই ফাংশনের জন্য প্রচলিত ছিল তখন কেন তারা পৃথিবীতে এটিকে স্প্লাইস বলার সিদ্ধান্ত নিয়েছিল ?!
ট্যাগস 2 কে

83
@ ট্যাগস 2 কে: কারণ ফাংশনটি আইটেমগুলি সন্নিবেশ করার চেয়ে আরও বেশি কাজ করে এবং এর নামটি ইতিমধ্যে পার্লটিতে প্রতিষ্ঠিত হয়েছিল?
ক্রিস্টোফ


55
স্প্লাইস সন্নিবেশ করতে পারে , তবে ঠিক যেমন ঘন ঘন হয় না । উদাহরণস্বরূপ: arr.splice(2,3)সূচক 2 থেকে শুরু হওয়া 3 টি উপাদান সরিয়ে ফেলবে 3 য় পাস না করে .... Nth প্যারামিটার কিছুই sertedোকানো হয় না। সুতরাং নামটিও insert()বিচার করে না।
ইবার

14
আমি মনে করি "স্প্লাইস" শব্দটি অর্থবোধ করে। স্প্লাইজ মানে যোগ দেওয়া বা সংযুক্ত হওয়া, পরিবর্তন করাও। আপনার কাছে একটি প্রতিষ্ঠিত অ্যারে রয়েছে যে আপনি এখন "পরিবর্তন" করছেন যা উপাদানগুলি যুক্ত করা বা অপসারণের সাথে জড়িত। আপনি অ্যারে কোথায় শুরু করবেন তা নির্দিষ্ট করুন, তারপরে কয়টি পুরানো আইটেমগুলি সরিয়ে ফেলতে হবে (যদি থাকে) এবং শেষ পর্যন্ত, বিকল্পগুলির সাথে যুক্ত করতে নতুন উপাদানগুলির একটি তালিকা। স্প্লাইস অবশ্যই একটি দুর্দান্ত সাই-ফাই টার্ম।
জাকুব কেলার

286

এটি করে আপনি Array.insertপদ্ধতিটি প্রয়োগ করতে পারেন :

Array.prototype.insert = function ( index, item ) {
    this.splice( index, 0, item );
};

তারপরে আপনি এটি ব্যবহার করতে পারেন:

var arr = [ 'A', 'B', 'D', 'E' ];
arr.insert(2, 'C');

// => arr == [ 'A', 'B', 'C', 'D', 'E' ]

9
আপনি ব্যবহার করতে পারেন একাধিক আইটেম সন্নিবেশ করতেArray.prototype.insert = function (index, items) { this.splice.apply(this, [index, 0].concat(items)); }
রায়ান স্মিথ

7
অ্যারেতে স্টাফ যোগ করার ক্ষেত্রে সমস্যাটি হ'ল আপনি যখন (আমি
আরআর তে

7
তবে মনে রাখবেন যে এটি অন্যান্য জাতীয় কোড বা ভবিষ্যতের কার্যকারিতার সাথে হস্তক্ষেপ করতে পারে সেজন্য দেশীয় প্রকারগুলি প্রসারিত করার প্রস্তাব দেওয়া হয়নি।
মার্জ করুন

16
আপনার মালিকানাধীন অবজেক্টগুলিকে সংশোধন করবেন না
লুইস ক্যাবেরা বেনিটো

4
প্রোটোটাইপগুলি সংশোধন করবেন না
satya164

141

স্প্লাইস ব্যতীত, আপনি এই পদ্ধতির ব্যবহার করতে পারেন যা মূল অ্যারেটিকে রূপান্তরিত করবে না, তবে যুক্ত আইটেমটি দিয়ে একটি নতুন অ্যারে তৈরি করবে। আপনার যখনই সম্ভব সম্ভব পরিবর্তনগুলি এড়ানো উচিত। আমি এখানে ES6 স্প্রেড অপারেটর ব্যবহার করছি।

const items = [1, 2, 3, 4, 5]

const insert = (arr, index, newItem) => [
  // part of the array before the specified index
  ...arr.slice(0, index),
  // inserted item
  newItem,
  // part of the array after the specified index
  ...arr.slice(index)
]

const result = insert(items, 1, 10)

console.log(result)
// [1, 10, 2, 3, 4, 5]

এটি নতুন আইটেমগুলির জন্য বাকি অপারেটরটি ব্যবহার করতে ফাংশনটি কিছুটা টুইট করে একাধিক আইটেম যুক্ত করতে ব্যবহৃত হতে পারে এবং প্রত্যাবর্তিত ফলাফলের মধ্যেও ছড়িয়ে দিতে পারে

const items = [1, 2, 3, 4, 5]

const insert = (arr, index, ...newItems) => [
  // part of the array before the specified index
  ...arr.slice(0, index),
  // inserted items
  ...newItems,
  // part of the array after the specified index
  ...arr.slice(index)
]

const result = insert(items, 1, 10, 20)

console.log(result)
// [1, 10, 20, 2, 3, 4, 5]


1
এটি করার জন্য এটি কি একটি ভাল, নিরাপদ উপায়? আমি জিজ্ঞাসা করছি কারণ এটি এত মার্জিত এবং সংক্ষিপ্ত বলে মনে হচ্ছে তবে এর কোনও উত্তর নেই touch তাদের বেশিরভাগই প্রোটোটাইপ অবজেক্টটি সংশোধন করে!
হর্ষ কাঞ্চিনা

5
@ হর্ষকঞ্চিনা সম্ভবত এটি কারণ সম্ভবত উত্তরগুলি ES6 পূর্ববর্তী, তবে এই অভিজ্ঞতাটি এখন আমার অভিজ্ঞতা থেকে খুব সাধারণ
gafi

77

কাস্টম অ্যারে insertপদ্ধতি

1. একাধিক যুক্তি এবং চেইন সমর্থন সহ

/* Syntax:
   array.insert(index, value1, value2, ..., valueN) */

Array.prototype.insert = function(index) {
    this.splice.apply(this, [index, 0].concat(
        Array.prototype.slice.call(arguments, 1)));
    return this;
};

এটি একাধিক উপাদান সন্নিবেশ করতে পারে (দেশীয় হিসাবে splice) এবং চেইন সমর্থন করে:

["a", "b", "c", "d"].insert(2, "X", "Y", "Z").slice(1, 6);
// ["b", "X", "Y", "Z", "c"]

2. অ্যারে-ধরণের আর্গুমেন্টগুলি মার্জ করা এবং চেইন সমর্থন সহ

/* Syntax:
   array.insert(index, value1, value2, ..., valueN) */

Array.prototype.insert = function(index) {
    index = Math.min(index, this.length);
    arguments.length > 1
        && this.splice.apply(this, [index, 0].concat([].pop.call(arguments)))
        && this.insert.apply(this, arguments);
    return this;
};

এটি প্রদত্ত অ্যারের সাথে যুক্তিগুলি থেকে অ্যারেগুলিকে মার্জ করতে পারে এবং চেইনিং সমর্থন করে:

["a", "b", "c", "d"].insert(2, "V", ["W", "X", "Y"], "Z").join("-");
// "a-b-V-W-X-Y-Z-c-d"

ডেমো: http://jsfiddle.net/UPphH/


যুক্তিগুলির মধ্যে এটির সন্ধান পেলে এই সংস্করণটিও একটি অ্যারে মার্জ করার কোনও কমপ্যাক্ট উপায় আছে?
নোলো

আমি প্রথম ফলাফল বুঝতে পারি না ["b", "X", "Y", "Z", "c"]। কেন "d"অন্তর্ভুক্ত করা হয় না ? আমার কাছে মনে হচ্ছে আপনি যদি 6 টি দ্বিতীয় প্যারামিটার হিসাবে স্থাপন করেন slice()এবং নির্দিষ্ট সূচী থেকে শুরু করে অ্যারেতে 6 টি উপাদান থাকে তবে আপনার ফিরে আসা মানটিতে 6 টি উপাদান পাওয়া উচিত। (ডক বলেছেন howManyযে পরামিতি জন্য।) Developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
অ্যালেক্সিস Wilke

আসলে, আমি যদি 3 বা ততোধিক সূচক ব্যবহার করি তবে আমি আউটপুটে কিছুই পাই না (কেস 1, ফায়ারফক্স) ["a", "b", "c", "d"].insert(2, "X", "Y", "Z").slice(3, 3);=>[ ]
অ্যালেক্সিস উইলক

@ অ্যালেক্সিস উইলক প্রথম উদাহরণে আমি sliceপদ্ধতিটি ব্যবহার করেছি এবং না splice, যা আপনি মন্তব্যে উল্লেখ করছেন। slice(নামযুক্ত end) এর দ্বিতীয় প্যারামিটারটি শূন্য-ভিত্তিক সূচক যাতে নিষ্কাশন শেষ হবে। sliceপর্যন্ত নিষ্কাশন কিন্তু অন্তর্ভুক্ত নাend । অত: পর পর insertআপনি ["a", "b", "X", "Y", "Z", "c", "d"]যেখান থেকে, sliceথেকে সূচকের সঙ্গে নির্যাস উপাদান 1পর্যন্ত 6থেকে, অর্থাত্ "b"করার "d"কিন্তু সহ না "d"। এটা বোঝা যায় না?
ভিজিওন

41

আপনি যদি একবারে কোনও অ্যারেতে একাধিক উপাদান সন্নিবেশ করতে চান তবে এই স্ট্যাক ওভারফ্লো উত্তরটি দেখুন: জাভাস্ক্রিপ্টের একটি অ্যারেতে অ্যারে বিভক্ত করার একটি আরও ভাল উপায়

উভয় উদাহরণ চিত্রিত করার জন্য এখানে কিছু ফাংশন রয়েছে:

function insertAt(array, index) {
    var arrayToInsert = Array.prototype.splice.apply(arguments, [2]);
    return insertArrayAt(array, index, arrayToInsert);
}

function insertArrayAt(array, index, arrayToInsert) {
    Array.prototype.splice.apply(array, [index, 0].concat(arrayToInsert));
    return array;
}

অবশেষে এখানে একটি জেএসফিডাল যাতে আপনি এটি নিজের জন্য দেখতে পারেন: http://jsfiddle.net/luisperezphd/Wc8aS/

এবং এইভাবে আপনি ফাংশনগুলি ব্যবহার করেন:

// if you want to insert specific values whether constants or variables:
insertAt(arr, 1, "x", "y", "z");

// OR if you have an array:
var arrToInsert = ["x", "y", "z"];
insertArrayAt(arr, 1, arrToInsert);

1
একবার যদি এটি একটি একক-উপাদান অ্যারেটোআনসার্ট তৈরি করে তবে ইনসার্টআরএট () সন্নিবেশআউট () কে আরও ভাল বলবে না? এটি অভিন্ন কোডটির পুনরাবৃত্তি এড়িয়ে চলে।
ম্যাট শ্যাচ

1
এটি 'প্রয়োগ' কখন ব্যবহার করবেন তার একটি দুর্দান্ত উদাহরণ
ক্রিশ

আমি সেই সূচীতে আইটেমগুলি সরিয়ে রাখার জন্য স্প্লাইসের ক্ষমতার সুবিধাগুলি নিতে এই পদ্ধতিতে একটি অপসারণ কাউন্ট প্যারামিটার যুক্ত করেছি: অ্যারে.প্রোটোটাইপ.স্প্লাইস. অ্যাপ্লিকেশন (অ্যারে, [সূচক, সরানকাউন্ট || 0] .কনক্যাট (অ্যারেটোইন্টার));
ক্রিস

23

যথাযথ ক্রিয়ামূলক প্রোগ্রামিং এবং শৃঙ্খলাবদ্ধতার উদ্দেশ্যে একটি উদ্ভাবন জরুরি Array.prototype.insert()। আসলে স্প্লাইসটি নিখুঁত হতে পারত যদি এটি সম্পূর্ণ অর্থহীন খালি অ্যারের পরিবর্তে পরিবর্তিত অ্যারেটি ফিরিয়ে দেয়। সুতরাং এখানে এটি যায়

Array.prototype.insert = function(i,...rest){
  this.splice(i,0,...rest)
  return this
}

var a = [3,4,8,9];
document.write("<pre>" + JSON.stringify(a.insert(2,5,6,7)) + "</pre>");

ঠিক আছে, Array.prototype.splice()উপরেরটিটির সাথে আসল অ্যারেটি পরিবর্তিত হয় এবং কেউ কেউ অভিযোগ করতে পারে "" আপনার নিজেরটি যা পরিবর্তন করে তা পরিবর্তন করা উচিত নয় "এবং এটি সঠিক হতে পারে। সুতরাং জনকল্যাণের জন্য আমি অন্যটি দিতে চাই Array.prototype.insert()যা মূল অ্যারেটি পরিবর্তন করে না। এখানে এটা যায়;

Array.prototype.insert = function(i,...rest){
  return this.slice(0,i).concat(rest,this.slice(i));
}

var a = [3,4,8,9],
    b = a.insert(2,5,6,7);
console.log(JSON.stringify(a));
console.log(JSON.stringify(b));


2
"একটি সম্পূর্ণ অর্থহীন খালি অ্যারে" - দ্বিতীয় প্যারামিটারটি 0 হলে এটি কেবল একটি খালি অ্যারে প্রদান করে যদি এটি 0 এর চেয়ে বেশি হয় তবে এটি অ্যারে থেকে সরানো আইটেমগুলি ফেরত দেয়। আপনি যে কোনও প্রোটোটাইপ যুক্ত করছেন এবং spliceমূল অ্যারেটিকে রূপান্তর করেছেন তা প্রদত্ত বলে আমি মনে করি না যে "যথাযথ ক্রিয়ামূলক প্রোগ্রামিং" এর আশেপাশের কোথাও অন্তর্ভুক্ত splice
ক্রিসবাজোরিন

আমরা এখানে সন্নিবেশ করানোর কথা বলছি এবং অ্যারে.প্রোটোটাইপ.স্প্লাইস () এর দ্বিতীয় প্যারামিটারটি শূন্য হতে হবে। এবং এটি কী ফিরিয়ে দেয় তার "আমি কোনও কিছু মুছলাম না" ব্যতীত অন্য কোনও অর্থ নেই এবং যেহেতু আমরা এটি কোনও আইটেম সন্নিবেশ করার জন্য ব্যবহার করি আমাদের কাছে ইতিমধ্যে সেই তথ্য রয়েছে। আপনি যদি মূল অ্যারেটি পরিবর্তন করতে না চান তবে আপনি দুটি অ্যারে.প্রোটোটাইপ.স্লাইস () এবং একটি অ্যারে.প্রোটোটাইপ.কনক্যাট () ক্রিয়াকলাপ দিয়ে একই কাজ করতে পারেন। এটা আপনার উপর নির্ভর করছে.
রেডু

1
আপনার দ্বিতীয় প্রয়োগটি পুরো পৃষ্ঠাটি থেকে সবচেয়ে পরিষ্কার এবং আপনার শূন্য ভোট রয়েছে। আমার গ্রহণ করুন এবং ভাল কাজ চালিয়ে যান। (আপনার কেবল প্রোটোটাইপটি পরিবর্তন করতে হবে তবে আপনি এটি ইতিমধ্যে জানেন)
নাইকো

1
আমি মনে করি এটি উল্লেখযোগ্য যে বাকী প্যারামিটারটি নতুন ইসিএমএ 6th ষ্ঠ ( বিকাশকারী.মোজিলা.আর.ইন
ডকস / ওয়েব

18

আমি এই ক্ষেত্রে খাঁটি জাভাস্ক্রিপ্ট ব্যবহার করার পরামর্শ দিচ্ছি , এছাড়াও জাভাস্ক্রিপ্টে কোনও সন্নিবেশ পদ্ধতি নেই, তবে আমাদের কাছে এমন একটি পদ্ধতি রয়েছে যা একটি বিল্ট-ইন অ্যারে পদ্ধতি যা আপনার জন্য কাজ করে, তাকে স্প্লাইস বলা হয় ...

আসুন দেখে নেওয়া যাক কি বিভক্ত () ...

স্প্লাইস () পদ্ধতিটি বিদ্যমান উপাদানগুলি সরিয়ে এবং / অথবা নতুন উপাদান যুক্ত করে একটি অ্যারের সামগ্রী পরিবর্তন করে।

ঠিক আছে, কল্পনা করুন আমাদের নীচে এই অ্যারে রয়েছে:

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

আমরা এটির 3মতো অপসারণ করতে পারি :

arr.splice(arr.indexOf(3), 1);

এটি 3 ফিরে আসবে, তবে এখনই আরারটি পরীক্ষা করা থাকলে আমাদের কাছে রয়েছে:

[1, 2, 4, 5]

এতক্ষণ, এত ভাল, তবে আমরা কীভাবে স্প্লাইস ব্যবহার করে অ্যারেতে একটি নতুন উপাদান যুক্ত করতে পারি? আসুন 3 টি পিছনে রাখা যাক ...

arr.splice(2, 0, 3);

আসুন দেখি আমরা কী করেছি ...

আমরা আবার স্প্লাইস ব্যবহার করি , তবে এবার দ্বিতীয় আর্গুমেন্টের জন্য, আমরা 0 পার করি , এর অর্থ আমরা কোনও আইটেম মুছতে চাই না, তবে একই সাথে আমরা তৃতীয় যুক্তি যুক্ত করি যা 3 হয় যা দ্বিতীয় সূচীতে যুক্ত হবে ...

আপনার সচেতন হওয়া উচিত, যে আমরা একই সাথে মুছতে এবং যুক্ত করতে পারি, উদাহরণস্বরূপ এখন আমরা এটি করতে পারি:

arr.splice(2, 2, 3);

যা সূচক 2 এ 2 টি আইটেম মুছে ফেলবে , তারপরে সূচক 2 এ 3 যুক্ত করবে এবং ফলাফলটি হবে:

[1, 2, 3, 5];

এটি দেখিয়ে দিচ্ছে যে বিচ্ছিন্ন প্রতিটি আইটেম কাজ করে:

অ্যারে.স্প্লাইস (শুরু করুন, মুছে ফেলা অ্যাকাউন্ট, আইটেম 1, আইটেম 2, আইটেম 3 ...)


13

একটি নির্দিষ্ট সূচীতে একক উপাদান যুক্ত করুন

//Append at specific position(here at index 1)
arrName.splice(1, 0,'newName1');
//1: index number, 0: number of element to remove, newName1: new element


//Append at specific position (here at index 3)
arrName[3] = 'newName1';

নির্দিষ্ট সূচীতে একাধিক উপাদান যুক্ত করুন

//Append from index number 1
arrName.splice(1, 0,'newElemenet1', 'newElemenet2', 'newElemenet3');
//1: index number from where append start, 
//0: number of element to remove, 
//newElemenet1,2,3: new elements

8
অরনাম [3] সংযোজন করা হয় না তা লক্ষ্য করে, এটি ওভাররাইড করে।
sfratini

এটি অশ্বচালনা ছাড়াই বিদ্যমান অ্যারেতে উপাদান যুক্ত করে, উদাহরণস্বরূপ: চলুন arrName = ['xxx', 'yYy', 'zzz']; arrName.splice (1, 0, 'আআ', 'বিবিবি', 'সিসিসি'); আরনামটি প্রিন্ট করার পরে
শ্রীকৃষ্ণ

যদি আরননেমে 3 টিরও বেশি উপাদান থাকে তবে আপনি 3 য় ওভাররাইড করছেন, সংযোজন নয় not নাকি আমি এটিকে ভুল পথে দেখছি?
sfratini

যদি আমরা মাঝখানে কোনও উপাদান sertোকান তবে এটি পরের উপাদানটিকে ওভারাইড না করে স্থানান্তরিত করে। আপনার সমস্যাটি দয়া করে নির্দিষ্ট করুন what একটি অ্যারে নিন (উদাহরণস্বরূপ) এবং আউটপুটে আপনার কী প্রয়োজন। plz আমার মন্তব্য
শ্রীকৃষ্ণ

1
arrName[3] = 'newName1';অ্যারেতে মাত্র 3 টি উপাদান থাকলে @ শ্রীকৃষ্ণ সংযোজন করবেন। সূচক 3-এ যদি কোনও উপাদান থাকে তবে এটি প্রতিস্থাপন করা হবে। আপনি যদি শেষে সংযোজন করতে চান তবে এটি ব্যবহার করা ভালarrName.push('newName1');
বিস্ময়কর

6

ব্যবহারের সাথে আরও একটি সম্ভাব্য সমাধান Array#reduce

var arr = ["apple", "orange", "raspberry"],
    arr2 = [1, 2, 4];

function insert(arr, item, index) {
    arr = arr.reduce(function(s, a, i) {
      i == index ? s.push(item, a) : s.push(a);
      return s;
    }, []);   
    console.log(arr);
}

insert(arr, "banana", 1);
insert(arr2, 3, 2);


6

এখানে দুটি উপায় রয়েছে:

const array = [ 'My', 'name', 'Hamza' ];

array.splice(2, 0, 'is');

console.log("Method 1 : ", array.join(" "));

অথবা

Array.prototype.insert = function ( index, item ) {
    this.splice( index, 0, item );
};

const array = [ 'My', 'name', 'Hamza' ];
array.insert(2, 'is');

console.log("Method 2 : ", array.join(" "));


4

যদিও এর ইতিমধ্যে উত্তর দেওয়া হয়েছে, আমি বিকল্প পদ্ধতির জন্য এই নোটটি যুক্ত করছি।

আমি একটি পরিচিত নম্বর রাখতে চাই আইটেমগুলির একটি অ্যারেতে নির্দিষ্ট অবস্থানগুলিতে , কারণ এগুলি একটি "এসোসিয়েটিভ অ্যারে" (অর্থাত্ কোনও বস্তু) থেকে আসে, যা সংজ্ঞায়িত অনুসারে বাছাই করা ক্রমে গ্যারান্টিযুক্ত নয়। আমি ফলস্বরূপ অ্যারেটি বস্তুর একটি অ্যারে হতে চেয়েছিলাম, তবে অ্যারেগুলি তাদের ক্রমের গ্যারান্টি দেয় বলে বস্তুগুলি অ্যারেটিতে একটি নির্দিষ্ট ক্রমে থাকবে। তাই আমি এটি করেছি।

প্রথম উত্স অবজেক্ট, পোস্টগ্র্রেএসকিউএল থেকে পুনরায় প্রাপ্ত একটি জেএসওএনবি স্ট্রিং। আমি প্রতিটি সন্তানের অবজেক্টে এটি "অর্ডার" সম্পত্তি অনুসারে বাছাই করতে চেয়েছিলাম।

var jsonb_str = '{"one": {"abbr": "", "order": 3}, "two": {"abbr": "", "order": 4}, "three": {"abbr": "", "order": 5}, "initialize": {"abbr": "init", "order": 1}, "start": {"abbr": "", "order": 2}}';

var jsonb_obj = JSON.parse(jsonb_str);

যেহেতু অবজেক্টে নোডের সংখ্যা জানা যায়, আমি প্রথমে নির্দিষ্ট দৈর্ঘ্যের সাথে একটি অ্যারে তৈরি করি:

var obj_length = Object.keys(jsonb_obj).length;
var sorted_array = new Array(obj_length);

এবং তারপরে অবজেক্টটি পুনরাবৃত্তি করুন, নতুনভাবে তৈরি অস্থায়ী বস্তুগুলিকে অ্যারেতে পছন্দসই স্থানে স্থাপন করুন সত্যই কোনও "বাছাই" না করেই।

for (var key of Object.keys(jsonb_obj)) {
  var tobj = {};
  tobj[key] = jsonb_obj[key].abbr;

  var position = jsonb_obj[key].order - 1;
  sorted_array[position] = tobj;
}

console.dir(sorted_array);

3

যে কেউ এখনও এটিকে নিয়ে সমস্যা রয়েছে এবং উপরের সমস্ত বিকল্প ব্যবহার করে দেখেছেন এবং এটি কখনও পান নি। আমি আমার সমাধানটি ভাগ করছি, এটি বিবেচনার জন্য যে আপনি অ্যারে বনাম আপনার বস্তুর বৈশিষ্ট্যগুলি স্পষ্টভাবে বলতে চান না।

function isIdentical(left, right){
    return JSON.stringify(left) === JSON.stringify(right);
}

function contains(array, obj){
    let count = 0;
    array.map((cur) => {
          if(this.isIdentical(cur, obj)) count++;
    });
    return count > 0;
}

এটি রেফারেন্স অ্যারেটি পুনরায় করা এবং আপনি যে বস্তুটি পরীক্ষা করতে চেয়েছিলেন তার সাথে এটির তুলনা করে উভয়কে একটি স্ট্রিংয়ে রূপান্তর করুন এবং যদি এটি মেলে তবে পুনরাবৃত্ত হয়। তারপরে আপনি কেবল গণনা করতে পারেন। এটি উন্নত করা যেতে পারে তবে আমি এখানেই স্থির হয়েছি। আশাকরি এটা সাহায্য করবে.


3

নিম্নলিখিত হিসাবে হ্রাস পদ্ধতির লাভ গ্রহণ:

function insert(arr, val, index) {
    return index >= arr.length 
        ? arr.concat(val)
        : arr.reduce((prev, x, i) => prev.concat(i === index ? [val, x] : x), []);
}

সুতরাং এই উপায়ে আমরা একটি নতুন অ্যারে ফিরিয়ে দিতে পারি (একটি দুর্দান্ত কার্যকরী উপায় হবে - পুশ বা স্প্লাইস ব্যবহারের চেয়ে আরও ভাল) ইনডেক্সে sertedোকানো উপাদানটির সাথে, এবং যদি সূচকের অ্যারের দৈর্ঘ্যের চেয়ে বেশি হয় তবে এটি সন্নিবেশ করা হবে শেষে.


3

Array#splice()আপনি যদি সত্যিই অ্যারে পরিবর্তনকে এড়াতে না চান তবেই যাওয়ার উপায়। 2 অ্যারে দেওয়া arr1এবং arr2, এখানে কিভাবে আপনি সামগ্রীগুলি প্রবেশ করানোর চাই arr2মধ্যে arr1প্রথম উপাদান পরে:

const arr1 = ['a', 'd', 'e'];
const arr2 = ['b', 'c'];

arr1.splice(1, 0, ...arr2); // arr1 now contains ['a', 'b', 'c', 'd', 'e']

console.log(arr1)

আপনি অ্যারে mutating (উদাহরণস্বরূপ, যদি Immutable.js ব্যবহার করে), আপনি যদি এর পরিবর্তে ব্যবহার করতে পারেন করার বিষয়ে উদ্বিগ্ন থাকেন slice(), না সঙ্গে বিভ্রান্ত করা যাবে splice()একটি সঙ্গে 'p'

const arr3 = [...arr1.slice(0, 1), ...arr2, ...arr1.slice(1)];

2

আমি এটি চেষ্টা করেছিলাম এবং এটি ভাল কাজ করছে!

var initialArr = ["India","China","Japan","USA"];
initialArr.splice(index, 0, item);

সূচি হ'ল অবস্থান যেখানে আপনি উপাদানটি সন্নিবেশ করতে বা মুছতে চান। 0 অর্থাৎ দ্বিতীয় প্যারামিটারগুলি সূচক থেকে সরানো আইটেমের সংখ্যার সংজ্ঞা দেয় যে নতুন এন্ট্রিগুলি আপনি অ্যারে করতে চান। এটি এক বা একাধিক হতে পারে।

initialArr.splice(2, 0, "Nigeria");
initialArr.splice(2, 0, "Australia","UK");

4
অনুলিপি উপরের উত্তরটি পেস্ট করুন। এটি প্রশ্নের কোনও মান যোগ করছে না। হয় আপনি একটি নতুন উত্তর যুক্ত করুন বা বিদ্যমান মন্তব্য। দয়া করে নতুন কিছু অবদান রাখার চেষ্টা করুন। আমরা এই সম্প্রদায়টি লুণ্ঠন করতে চাই না
হান্নাদ রেহমান

1

এখানে একটি কার্যকারী ফাংশন যা আমি আমার অ্যাপ্লিকেশনগুলির একটিতে ব্যবহার করি।

আইটেমটি প্রস্থান করে কিনা তা পরীক্ষা করে

let ifExist = (item, strings = [ '' ], position = 0) => {
     // output into an array with empty string. Important just in case their is no item. 
    let output = [ '' ];
    // check to see if the item that will be positioned exist.
    if (item) {
        // output should equal to array of strings. 
        output = strings;
       // use splice in order to break the array. 
       // use positition param to state where to put the item
       // and 0 is to not replace an index. Item is the actual item we are placing at the prescribed position. 
        output.splice(position, 0, item);
    }
    //empty string is so we do not concatenate with comma or anything else. 
    return output.join("");
};

এবং তারপর আমি এটি নীচে কল।

ifExist("friends", [ ' ( ', ' )' ], 1)}  // output: ( friends )
ifExist("friends", [ ' - '], 1)}  // output:  - friends 
ifExist("friends", [ ':'], 0)}  // output:   friends: 

1

কিছুটা পুরানো থ্রেড, তবে আমাকে উপরে রেডুর সাথে একমত হতে হবে কারণ স্প্লাইসটিতে অবশ্যই একটি বিভ্রান্তিকর ইন্টারফেস রয়েছে। এবং সিডিবাজোরিন যে প্রতিক্রিয়া দিয়েছিলেন যে "দ্বিতীয় প্যারামিটারটি 0 হলে এটি কেবল একটি খালি অ্যারে প্রদান করে" যদি এটি 0 এর চেয়ে বেশি হয় তবে এটি অ্যারে থেকে সরানো আইটেমগুলি ফিরিয়ে দেয় "সঠিক, বিন্দুটি প্রমাণ করে। ফাংশনটির উদ্দেশ্যটি বিভক্ত করা বা জাকোব কেলারের আগে যেমন বলা হয়েছিল, "যোগদান করা বা সংযোগ স্থাপন করাও পরিবর্তন করা to আপনার একটি প্রতিষ্ঠিত অ্যারে রয়েছে যা আপনি এখন পরিবর্তন করছেন যা উপাদান যুক্ত করা বা অপসারণের সাথে জড়িত ..." প্রদত্ত, মুছে ফেলা উপাদানগুলির রিটার্ন মান, সর্বোপরি বিশ্রী। এবং আমি 100% একমত যে এই পদ্ধতিটি প্রাকৃতিক বলে মনে হয় যদি এটি ফিরে আসে তবে মেশানো উপাদানগুলির সাথে একটি নতুন অ্যারে যুক্ত হয় তবে শৃঙ্খলার পক্ষে আরও উপযুক্ত হতে পারত। তারপরে আপনি ["19", "17"] এর মতো জিনিসগুলি করতে পারেন sp স্প্লাইস (1,0, "18") join যোগ দিন ("...") অথবা আপনি ফিরে আসা অ্যারের সাথে যা কিছু পছন্দ করেন। এটি সরিয়ে ফেলা হয়েছে যা ফিরে আসে তা হ'ল কেবল বেমানান আইএমএইচও। যদি পদ্ধতির উদ্দেশ্যটি ছিল "উপাদানগুলির একটি সেট কাটা" এবং এটি কেবল এটিই ছিল, সম্ভবত। দেখে মনে হচ্ছে আমি ইতিমধ্যে আমি কী কাটাচ্ছি তা না জানলেও, আমার সম্ভবত সেই উপাদানগুলি কেটে ফেলার খুব কম কারণ আছে, তাই না? এটি যদি কনক্যাট, মানচিত্র, হ্রাস, স্লাইস ইত্যাদির মতো আচরণ করে তবে এটি আরও ভাল হবে যেখানে বিদ্যমান অ্যারেটি পরিবর্তনের পরিবর্তে বিদ্যমান অ্যারে থেকে নতুন অ্যারে তৈরি করা হয়। এগুলি সমস্ত চেইনযোগ্য, এবং এটি একটি উল্লেখযোগ্য বিষয়। এটি চেইন অ্যারে হেরফেরের চেয়ে সাধারণ rather মনে হচ্ছে ভাষার এক বা অন্য দিকে যেতে হবে এবং যথাসম্ভব এটিকে আঁকড়ে ধরার চেষ্টা করা উচিত। জাভাস্ক্রিপ্ট কার্যকরী এবং কম ঘোষণামূলক হওয়ায় এটি আদর্শ থেকে একটি অদ্ভুত বিচ্যুতি বলে মনে হচ্ছে।


-2

কর্মক্ষমতা

আজ (2020.04.24) আমি বড় এবং ছোট অ্যারেগুলির জন্য নির্বাচিত সমাধানগুলির জন্য পরীক্ষাগুলি সম্পাদন করি। আমি সেগুলি ক্রোম 81.0, সাফারি 13.1, ফায়ারফক্স 75.0 এ ম্যাকওস হাই সিয়েরা 10.13.6 এ পরীক্ষা করেছি।

উপসংহার

সমস্ত ব্রাউজারের জন্য

  • আশ্চর্যজনকভাবে ছোট অ্যারেগুলির জন্য স্থান-নির্ধারিত সমাধানগুলির উপর ভিত্তি করে sliceএবং reduce(ডি, ই, এফ) সাধারণত স্থানের সমাধানগুলির চেয়ে 10x-100x দ্রুত হয়
  • বড় অ্যারেগুলির জন্য splice(এআই, বিআই, সিআই) ভিত্তিক ইন-প্লেস- সলিউশনগুলি দ্রুত ছিল (কখনও কখনও x 100x - তবে এটি অ্যারের আকারের উপর নির্ভর করে)
  • ছোট অ্যারেগুলির জন্য বিআই সমাধানটি সবচেয়ে ধীর ছিল
  • বড় অ্যারেগুলির জন্য E সমাধানটি সবচেয়ে ধীর ছিল

এখানে চিত্র বর্ণনা লিখুন

বিস্তারিত

পরীক্ষাগুলি দুটি গ্রুপে বিভক্ত ছিল: ইন-প্লেস সলিউশন (এআই, বিআই, সিআই) এবং নন-ইন-প্লেস সলিউশন (ডি, ই, এফ) এবং দুটি মামলার জন্য সম্পাদন করা হয়েছিল

  • 10 টি উপাদান সহ অ্যারের জন্য পরীক্ষা - আপনি এটি চালাতে পারেন এখানে
  • 1.000.000 উপাদান সহ অ্যারের জন্য পরীক্ষা - আপনি এটি এখানে চালাতে পারেন

পরীক্ষিত কোড নীচে স্নিপেট উপস্থাপন করা হয়

Chrome এ ছোট অ্যারের উদাহরণস্বরূপ ফলাফলগুলি নীচে রয়েছে are

এখানে চিত্র বর্ণনা লিখুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.