it-swarm.asia

كيفية إدراج عنصر في صفيف في فهرس معين (JavaScript)؟

أنا أبحث عن طريقة إدراج صفيف JavaScript ، بأسلوب:

arr.insert(index, item)

ويفضل أن يكون ذلك في jQuery ، ولكن أي تطبيق JavaScript سيتم في هذه المرحلة.

2464
tags2k

ما تريده هو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());
3988
tvanfosson

يمكنك تطبيق الأسلوب 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' ]
247
FrEsC 81

بخلاف اللصق ، يمكنك استخدام هذه الطريقة التي لن تؤدي إلى تغيير الصفيف الأصلي ، ولكن ستقوم بإنشاء صفيف جديد مع العنصر المضافة. يجب عليك عادة تجنب الطفرة كلما أمكن ذلك. أنا أستخدم 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]
85
Gaafar

صفيف مخصص 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/

70
VisioN

إذا كنت تريد إدراج عناصر متعددة في صفيف مرة واحدة ، تحقق من إجابة Stack Overflow هذه: طريقة أفضل لصق صفيف في صفيف في javascript

هنا أيضًا بعض الوظائف لتوضيح كلا المثالين:

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

أخيرًا هنا jsFiddle حتى تتمكن من رؤيته بنفسك: 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);
33
Luis Perez

لأغراض البرمجة الوظيفية والسلاسل الوظيفية ، يعد اختراع 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));
17
Redu

أوصي باستخدام pure JavaScript في هذه الحالة ، أيضًا لا توجد طريقة إدراج في JavaScript ، ولكن لدينا طريقة هي Array مضمن الطريقة التي تؤدي المهمة بالنسبة لك ، يطلق عليه لصق ...

دعونا نرى ما هو لصق () ...

يغير الأسلوب splice () محتويات صفيف عن طريق إزالة العناصر الموجودة و/أو إضافة عناصر جديدة.

حسنا ، تخيل أن لدينا هذه المجموعة أدناه:

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

يمكننا إزالة 3 كما يلي:

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

سيعود 3 ، ولكن إذا تحققنا من arr الآن ، فلدينا:

[1, 2, 4, 5]

جيد حتى الآن ، لكن كيف يمكننا إضافة عنصر جديد للصفيف باستخدام الوصلة؟ دعنا نعيد 3 في ال ...

arr.splice(2, 0, 3);

دعونا نرى ما قمنا به ...

نحن نستخدم لصق مرة أخرى ، لكن هذه المرة للوسيطة الثانية ، نمر 0 ، يعني أننا نريد حذف أي عنصر ، لكن في الوقت نفسه ، نضيف الوسيطة الثالثة وهي 3 التي ستضاف في الفهرس الثاني ...

يجب أن تدرك أنه يمكننا حذف و إضافة في نفس الوقت ، على سبيل المثال الآن يمكننا القيام بما يلي:

arr.splice(2, 2, 3);

الذي سيحذف عنصرين في الفهرس 2 ، ثم يضاف 3 في الفهرس 2 وستكون النتيجة:

[1, 2, 3, 5];

هذا يوضح كيف يعمل كل عنصر في لصق:

array.splice (البداية ، deleteCount ، item1 ، item2 ، item3 ...)

11
Alireza

على الرغم من أن هذا قد تمت الإجابة عليه بالفعل ، إلا أنني أضيف هذه الملاحظة لمقاربة بديلة.

كنت أرغب في وضع عدد معروف من العناصر في صفيف ، في مواضع محددة ، لأنها تأتي من "مجموعة اقتران" (أي كائن) والتي بحكم التعريف ليست مضمونة في ترتيب فرزها. أردت أن يكون الصفيف الناتج عبارة عن مجموعة من الكائنات ، لكن الكائنات تكون بترتيب معين في الصفيف لأن الصفيف يضمن ترتيبها. لذلك فعلت هذا.

أولاً كائن المصدر ، سلسلة JSONB تم استردادها من PostgreSQL. أردت أن يتم الفرز حسب خاصية "الطلب" في كل كائن فرعي.

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

حل آخر ممكن ، مع استخدام 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
kind user

إلحاق عنصر مفرد في فهرس محدد

//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
6
Srikrushna Pal

لقد جربت هذا وهو يعمل بشكل جيد!

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

الفهرس هو الموضع الذي تريد إدراج العنصر فيه أو حذفه. 0 بمعنى أن المعلمات الثانية تحدد عدد العنصر من الفهرس المراد إزالته ، فإن الإدخالات الجديدة التي تريد تكوينها في المصفوفة. يمكن أن يكون واحد أو أكثر من واحد.

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

أي شخص لا يزال يواجه مشكلات مع هذا وقد جرب جميع الخيارات المذكورة أعلاه ولم يحصل عليها مطلقًا. أشارك الحل الخاص بي ، وهذا هو أن تأخذ في الاعتبار أنك لا تريد أن تحدد صراحة خصائص كائنك مقابل المصفوفة.

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

هذا عبارة عن مزيج من تكرار الصفيف المرجعي ومقارنته بالكائن الذي تريد التحقق منه ، وتحويلهما إلى سلسلة ثم تكراره إذا كان مطابقًا. ثم يمكنك الاعتماد فقط. يمكن تحسين هذا ولكن هذا هو المكان الذي استقرت فيه. أتمنى أن يساعدك هذا.

2
Clyde

جني الأرباح من طريقة الحد على النحو التالي:

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

وبهذه الطريقة ، يمكننا إرجاع صفيف جديد (ستكون طريقة وظيفية رائعة - أفضل بكثير من استخدام Push أو splice) مع إدراج العنصر في الفهرس ، وإذا كان الفهرس أكبر من طول المصفوفة ، فسيتم إدراجه في نهايةالمطاف.

2
alejoko

فيما يلي وظيفة العمل التي أستخدمها في أحد طلبي.

هذا يتحقق إذا خروج البند

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: 
0
Lesly Revenge