كيف يمكنني اجتياز كائن JavaScript والتحقق من القيم الخالية؟

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

  •  12-12-2019
  •  | 
  •  

سؤال

لنفترض أن لدي كائن JavaScript مثل:

var obj = {};
obj.computers = {};
obj.computers.favorite = "Commodore 64";
obj.computers.popular = "Apple";

الآن، يمكنني بسهولة التحقق من وجود قيمة فارغة مثل:

if(obj != 'undefined' && obj != null) {
    if(obj.computers != 'undefined' && obj.computers != null)) {
        .....

كما ترون، إذا كنت بحاجة لمعرفة ما إذا كان obj.computers.favorite تم تعيينه، لا بد لي من دمج بعض المنطق الشرطي هناك.تصل بعض أغراضنا إلى عمق 3، 4، 5 مستويات.

هذا ما أود أن أكون قادرًا على القيام به:

var fav = obj.computers.favorite || 'Unknown';

لكنني أدرك أنني سأحتاج إلى تغليف ذلك بطريقة ما.شيء مثل:

var fav = getValueOrDefault(obj.computers.favorite, 'Unknown');

اقتراحات موضع تقدير.

شكرًا

يحرر

التحقق من "غير محدد" ليس في الواقع ما أستخدمه.لقد خرج للتو من رأسي عندما طرحت السؤال.مضحك جداً

لكنني كنت أتساءل، هل يمكنني فقط إجراء محاولة/التقاط ورمي الاستثناء الافتراضي؟

function(obj, default) {
    try {
        if(obj != null) {
            return obj;
        } else {
            return default;
        }
    } catch(ex) {
        return default;
    }
}

أيضًا، شكرًا لـ Shusi على الإشارة إلى vars الزائدة عن الحاجة.

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

المحلول

يمكنك أن تفعل ذلك مع المساعد وظيفة.إذا فهمت مشكلتك بشكل صحيح، الأشياء الخاصة بك قد يملك كائنات عميقة عشوائية، وتريد الوصول إلى هذه الخصائص المتداخلة العشوائية دون ازدحام التعليمات البرمجية الخاصة بك.لقد بنيت أ Nested الوظيفة التي تتيح لك get() خصائص عشوائية إذا تم تعيينها، أو افتراضية إذا لم يتم تعيينها.

var Nested = function() {};
// prop is a dot-separated path like "foo.bar.baz"
Nested.prototype.get = function(prop, _default) {
    var current = this;
    $.each(prop.split("."), function(i, e) {
        current = current[e] || undefined;
        if (current == undefined)
            return false;
    });
    return current || _default;
}

يمكنك بعد ذلك كتابة التعليمات البرمجية مثل هذا

var fav = obj.get("computers.favourite", "Linux");
// this emulates
var fav = obj.computers.favourite || "Linux"; // throws error

كما ترون، الأمر لا يتعلق بالكتابة أكثر من ذلك بكثير.بالتأكيد، لا أشعر بذلك جافا سكريبت العادية... هنا الكمان.

نصائح أخرى

يمكنك الكتابة حقا: giveacodicetagpre.

كتبت هذا لمساعدتك في التعامل مع أحد أسئلتك:"أحتاج لمعرفة ما إذا كان قد تم تعيين obj.computers.favorite".

Object.prototype.isset = function (/* string */ full_path)
{
    var props = full_path.split('.');
    var self = this; /* note that self is usually the window object */

    for (var ii = 0; ii < props.length; ++ii)
    {
        var prop = props[ii];
        var hasMoreComing = ii < props.length - 1 ? true : false;

        if (self[prop] !== null && typeof self[prop] === 'object' && hasMoreComing)
        {
            self = self[prop];
            continue;   // Move up one level.
        }
        else if (hasMoreComing)
            return false;    // ..because user queries a subproperty of a value type

        return self.hasOwnProperty(prop);
    }
};

رمز الاختبار:

var test = {};

test.kuk = {};
console.log( test.isset('kuk') );  // Prints true.

test.kuk.fitta = {};
console.log( test.isset('kuk.fitta') ); // Prints true.

test.kuk.fitta = null;
console.log( test.isset('kuk.fitta') ); // Prints true.

test.kuk.fitta = undefined;
console.log( test.isset('kuk.fitta') );  // Prints true

delete test.kuk.fitta;
console.log( test.isset('kuk.fitta') );  // Prints false

test.kuk.fitta = 123;
console.log( test.isset('kuk.fitta.doesnt.exist') );  // Prints false

لسوء الحظ، ليست هناك طريقة سهلة للغاية للتجول في هذا، لكنك لا تحتاج إلى التحقق من كل من Null وغير محدد.لأن NULL وغير معروف كلاهما كلاهما، يمكنك فقط القيام به: giveacodicetagpre.

لا يحصل في الواقع على ما شكونك، لكنه أقل إيلاما مما تعتقده.

ستأخذ الوظيفة التالية السلسلة كمعلمة وترجع الكائن إذا كان موجودًا

 function getValueOrDefault(str , obj, deflt){
    var a = str.split("."); o = obj;
    for(var i =0; i < a.length; i++){
         o = obj[a[i]];
         if(!o){
           return deflt;
         }
    }
      return o;
}

var obj = {};
obj.computers = {};
obj.computers.favorite = "Commodore 64";
obj.computers.popular = "Apple";
getValueOrDefault('computers.favorite', obj, 'Unknown');

ملحوظة:يجب ألا تستخدم var أثناء تعيين خصائص للكائن على سبيل المثال. var obj.computers.favorite هو خطأ في بناء الجملة.

يمكنك أيضًا القيام بذلك باستخدام جافا سكريبت ES5 reduce وظيفة :

function get(root, member) {
    return member.split('.').reduce((acc, value) => {
        return (acc && typeof acc[value] !== 'undefined') ? acc[value] : undefined
    }, root);
}

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

يمكنك استخدامه بهذه الطريقة، حتى مع المصفوفات:

let obj = {
    computers : {
        favorite : "Commodore 64",
        popular : "Apple",
        list: [
            {
                sn : "TDGE52343FD76",
                price: "9867.99",
                options: {
                    fanless: true
                }
            }
        ]
    }
}

get(obj, 'computers.popular');
// => "Apple"
get(obj, 'computers.list.0.sn');
// => "TDGE52343FD76"
get(obj, 'computers.list.0.options.fanless');
// => true
get(obj, 'computers.list.0.options.runsWithoutEletricity');
// => undefined
get(obj, 'computers.list.0.options.runsWithoutEletricity') || "too bad..." ;
// => "too bad..."

هناك كودبن ل اجتياز كائن JS بأمان

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top