كيف يمكنني إزالة الكائنات من مجموعة ترابطية جافا سكريبت؟

StackOverflow https://stackoverflow.com/questions/346021

سؤال

لنفترض أن لدي هذا الرمز:

var myArray = new Object();
myArray["firstname"] = "Bob";
myArray["lastname"] = "Smith";
myArray["age"] = 25;

الآن إذا أردت إزالة "اسم العائلة"؟.... هل هناك ما يعادله
myArray["lastname"].remove()?

(أحتاج إلى إزالة العنصر لأن عدد العناصر مهم وأريد الحفاظ على نظافة الأشياء.)

هل كانت مفيدة؟

المحلول

استخدم في "حذف" الكلمة الرئيسية في جافا سكريبت.

delete myArray["lastname"];

وتحرير:

في بعض محرك جافا سكريبت، قد الكلمة حذف يضر الأداء كما أنه سيتم التراجع عن تحسين الترجمة / JIT.

http://www.html5rocks.com/en/tutorials/speed/v8 / http://www.smashingmagazine.com/2012/11/ الكتابة السرعة الذاكرة كفاءة-جافا سكريبت /

نصائح أخرى

وتنفذ جميع الكائنات في جافا سكريبت كما صفائف hashtables / النقابي. لذلك، وفيما يلي ما يعادل:

alert(myObj["SomeProperty"]);
alert(myObj.SomeProperty);

وكما سبقت الإشارة، وانت "إزالة" خاصية من كائن عبر الكلمة delete، والتي يمكنك استخدامها بطريقتين:

delete myObj["SomeProperty"];
delete myObj.SomeProperty;

ونأمل أن معلومات اضافية تساعد ...

وأي من الأجوبة السابقة تعالج حقيقة أن جافا سكريبت لايوجد صفائف النقابي لتبدأ - لا يوجد اي نوع array على هذا النحو، انظر> وأ href = "https://developer.mozilla.org/en/JavaScript/ المرجع / مشغلي / تشير typeof "يختلط =" نوفولو noreferrer "> typeof .

ما الذي جافا سكريبت، حالات الكائن مع الخصائص الحيوية. عندما يتم الخلط بين الخصائص مع عناصر مثيل كائن صفيف ثم سوء الأمور ™ لا بد أن يحدث:

مشكلة

var elements = new Array()

elements.push(document.getElementsByTagName("head")[0])
elements.push(document.getElementsByTagName("title")[0])
elements["prop"] = document.getElementsByTagName("body")[0]

console.log("number of elements: ", elements.length)   // returns 2
delete elements[1]
console.log("number of elements: ", elements.length)   // returns 2 (?!)

for (var i = 0; i < elements.length; i++)
{
   // uh-oh... throws a TypeError when i == 1
   elements[i].onmouseover = function () { window.alert("Over It.")}
   console.log("success at index: ", i)
}

الحل

لديك وظيفة إزالة العالمية التي لا تهب على لك، استخدم:

Object.prototype.removeItem = function (key) {
   if (!this.hasOwnProperty(key))
      return
   if (isNaN(parseInt(key)) || !(this instanceof Array))
      delete this[key]
   else
      this.splice(key, 1)
};

//
// Code sample.
//
var elements = new Array()

elements.push(document.getElementsByTagName("head")[0])
elements.push(document.getElementsByTagName("title")[0])
elements["prop"] = document.getElementsByTagName("body")[0]

console.log(elements.length)                        // returns 2
elements.removeItem("prop")
elements.removeItem(0)
console.log(elements.hasOwnProperty("prop"))        // returns false as it should
console.log(elements.length)                        // returns 1 as it should

وهذا يزيل فقط حذف الكائن ولكن لا تزال تحافظ على طول مجموعة نفسها.

لإزالة ما عليك القيام به شيئا مثل:

array.splice(index, 1);

في حين أن الإجابة المقبولة صحيحة، إلا أنها تفتقد تفسير سبب نجاحها.

بادئ ذي بدء، يجب أن يعكس الكود الخاص بك حقيقة ذلك لا مجموعة:

var myObject = new Object();
myObject["firstname"] = "Bob";
myObject["lastname"] = "Smith";
myObject["age"] = 25;

لاحظ أن كافة الكائنات (بما في ذلك Arrays) يمكن استخدامه بهذه الطريقة.ومع ذلك، لا تتوقع أن تعمل وظائف مصفوفة JS القياسية (البوب، الدفع،...) على الكائنات!

كما قيل في الإجابة المقبولة، يمكنك بعد ذلك استخدام delete لإزالة الإدخالات من الكائنات:

delete myObject["lastname"]

يجب عليك أن تقرر المسار الذي ترغب في اتباعه - إما استخدام الكائنات (المصفوفات الترابطية/القواميس) أو استخدام المصفوفات (الخرائط).لا تخلط بينهما أبدًا.

واستخدام أسلوب splice لإزالة عنصر من مجموعة وجوه:

Object.prototype.removeItem = function (key, value) {
    if (value == undefined)
        return;

    for (var i in this) {
        if (this[i][key] == value) {
            this.splice(i, 1);
        }
    }
};

var collection = [
    { id: "5f299a5d-7793-47be-a827-bca227dbef95", title: "one" },
    { id: "87353080-8f49-46b9-9281-162a41ddb8df", title: "two" },
    { id: "a1af832c-9028-4690-9793-d623ecc75a95", title: "three" }
];

collection.removeItem("id", "87353080-8f49-46b9-9281-162a41ddb8df");

وأنت تستخدم كائن، لا يتم وجود مجموعة النقابي لتبدأ. مع مجموعة النقابي، إضافة وإزالة العناصر غني عن مثل هذا:

    Array.prototype.contains = function(obj) 
    {
        var i = this.length;
        while (i--) 
        {
            if (this[i] === obj) 
            {
                return true;
            }
        }
        return false;
    }


    Array.prototype.add = function(key, value) 
    {
        if(this.contains(key))
            this[key] = value;
        else
        {
            this.push(key);
            this[key] = value;
        }
    }


    Array.prototype.remove = function(key) 
    {
        for(var i = 0; i < this.length; ++i)
        {
            if(this[i] == key)
            {
                this.splice(i, 1);
                return;
            }
        }
    }



    // Read a page's GET URL variables and return them as an associative array.
    function getUrlVars()
    {
        var vars = [], hash;
        var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');

        for(var i = 0; i < hashes.length; i++)
        {
            hash = hashes[i].split('=');
            vars.push(hash[0]);
            vars[hash[0]] = hash[1];
        }

        return vars;
    }



    function ForwardAndHideVariables() {
        var dictParameters = getUrlVars();

        dictParameters.add("mno", "pqr");
        dictParameters.add("mno", "stfu");

        dictParameters.remove("mno");



        for(var i = 0; i < dictParameters.length; i++)
        {
            var key = dictParameters[i];
            var value = dictParameters[key];
            alert(key + "=" + value);
        }
        // And now forward with HTTP-POST
        aa_post_to_url("Default.aspx", dictParameters);
    }


    function aa_post_to_url(path, params, method) {
        method = method || "post";

        var form = document.createElement("form");

        //move the submit function to another variable
        //so that it doesn't get written over if a parameter name is 'submit'
        form._submit_function_ = form.submit;

        form.setAttribute("method", method);
        form.setAttribute("action", path);

        for(var i = 0; i < params.length; i++)
        {
            var key = params[i];

            var hiddenField = document.createElement("input");
            hiddenField.setAttribute("type", "hidden");
            hiddenField.setAttribute("name", key);
            hiddenField.setAttribute("value", params[key]);

            form.appendChild(hiddenField);
        }

        document.body.appendChild(form);
        form._submit_function_(); //call the renamed function
    }

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

إذا كان لديك مجموعة وليس كائن، هل يمكن استخدام المصفوفة <لأ href = "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter . "يختلط =" نوفولو "> تصفية وظيفة، للعودة مجموعة جديدة من دون العنصر الذي تريد إزالتها:

var myArray = ['Bob', 'Smith', 25];
myArray = myArray.filter(function(item) {
    return item !== 'Smith';
});

إذا كان لديك متصفح قديم ومسج، مسج لديه $.grep طريقة الذي يعمل بالمثل :

myArray = $.grep(myArray, function(item) {
    return item !== 'Smith';
});

وهناك طريقة أنيقة في الدليل نمط عبر Airbnb للقيام بذلك (ES7):

const myObject = {
  a: 1,
  b: 2,
  c: 3
};
const { a, ...noA } = myObject;
console.log(noA); // => { b: 2, c: 3 }

وحقوق النشر: https://codeburst.io / استخدام-es2015 وجوه بقية مشغل إلى احذف-خصائص 38a3ecffe90

إذا لأي سبب من الأسباب لا يعمل مفتاح الحذف (مثل واسنت العمل ل لي)

ويمكنك لصق بها ومن ثم تصفية القيم غير معروف

// to cut out one element via arr.splice(indexToRemove, numberToRemove);
array.splice(key, 1)
array.filter(function(n){return n});

لا تحاول والسلسلة لهم منذ عودة لصق العناصر إزالتها؛

ويمكنك إزالة إدخال من الخريطة الخاصة بك عن طريق تعيين صراحة إلى "غير معروف". كما هو الحال في قضيتك:

<اقتباس فقرة>   

وmyArray [ "اللقب"] = غير معروف؛

وعلى التوالي جدا إلى الأمام إذا كان لديك underscore.js التبعية في المشروع -

_.omit(myArray, "lastname")

ونحن يمكن استخدامها بوصفها وظيفة للغاية. الزاوي يلقي بعض الخطأ إذا ما استخدمت كنموذج. بفضلHarpyWar. انها ساعدتني في حل المشكلة.

var removeItem = function (object, key, value) {
    if (value == undefined)
        return;

    for (var i in object) {
        if (object[i][key] == value) {
            object.splice(i, 1);
        }
    }
};

var collection = [
    { id: "5f299a5d-7793-47be-a827-bca227dbef95", title: "one" },
    { id: "87353080-8f49-46b9-9281-162a41ddb8df", title: "two" },
    { id: "a1af832c-9028-4690-9793-d623ecc75a95", title: "three" }
];

removeItem(collection, "id", "87353080-8f49-46b9-9281-162a41ddb8df");

باستخدام "delete" الكلمة الأساسية، ستحذف عنصر الصفيف من الصفيف في جافا سكريبت.

على سبيل المثال،

النظر في العبارات التالية.

var arrayElementToDelete = new Object();

arrayElementToDelete["id"]           = "XERTYB00G1"; 
arrayElementToDelete["first_name"]   = "Employee_one";
arrayElementToDelete["status"]       = "Active"; 

delete arrayElementToDelete["status"];

سيؤدي السطر الأخير من الكود إلى إزالة عنصر المصفوفة الذي مفتاحه هو "الحالة" من المصفوفة.

var myArray = newmyArray = new Object(); 
myArray["firstname"] = "Bob";
myArray["lastname"] = "Smith";
myArray["age"] = 25;

var s = JSON.stringify(myArray);

s.replace(/"lastname[^,}]+,/g,'');
newmyArray = JSON.parse(p);

وبدون حلقات / بالتكرار نحصل على نفس النتيجة

بالنسبة لـ "المصفوفات":

إذا كنت تعرف الفهرس:

array.splice(index, 1);

إذا عرفت القيمة:

function removeItem(array, value) {
    var index = array.indexOf(value);
    if (index > -1) {
        array.splice(index, 1);
    }
    return array;
}

الإجابة الأكثر تصويتا ل delete يعمل بشكل جيد في حالة الكائنات ولكن ليس في حالة المصفوفات الحقيقية.إذا كنت تستخدم delete فهو يزيل العناصر من الحلقات ولكنه يحافظ على العنصر كما هو empty ولن يتغير طول المصفوفة.قد يكون هذا مشكلة في بعض السيناريوهات.

على سبيل المثال، إذا قمت بإجراء myArray.toString() على myArray بعد الإزالة عبر delete يقوم بإنشاء إدخال فارغ أي،،

تحليل أسلوب العمل الوحيد بالنسبة لي:

function removeItem (array, value) {
    var i = 0;
    while (i < array.length) {
        if(array[i] === value) {
            array.splice(i, 1);
        } else {
            ++i;
        }
    }
    return array;
}

والاستعمال:

var new = removeItem( ["apple","banana", "orange"],  "apple");
// ---> ["banana", "orange"]
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top