簡體   English   中英

Javascript,如果存在,則查找嵌套屬性

[英]Javascript, find nested property if exists

伙計們,給定一個對象,我只需要找到並返回嵌套在以下內容中的第一個tag屬性:

{
   data: { 
     cat: false,
     horse: { 
        tag: 'somestring' 
     },
     dog: false
   }       
}

注意:數據也可能是假的。

使用 lodash 最簡單的方法是什么? 使用遞歸函數可能看起來不錯......可能可以本地破解一些東西,但我確信善良的人有更短,更容易閱讀的方式

這個迭代函數將返回第一個標簽鍵值。

function iterate (obj, key) {
var result;

for (var property in obj) {
    if (obj.hasOwnProperty(property)) {
        // in case it is an object
        if (typeof obj[property] === "object") {
            result = iterate(obj[property], key);

            if (typeof result !== "undefined") {
                return result;
            }
        }
        else if (property === key) {
            return obj[key]; // returns the value
        }
    }   
  }
}

傳遞您的對象並鍵入函數。 iterate(obj,'tag');

好吧,如果您想要更簡單的方法(不是最佳性能)並且易於操作代碼,那么您可以將回調傳遞給JSON.parse (我們用來控制解析)並檢查字符串化版本中的鍵對象。

讓我們創建一個簡單的示例,我們將在找到第一個匹配項時使其有效地打破它。

這是一個簡單的

 var obj = { data: { cat: false, horse: { tag: 'somestring' }, dog: false } } function keyExist(object, key) { var flag = false; JSON.parse(JSON.stringify(object), function(k, v) { if(k===key) {flag=true}; return v; }); return flag; }; console.log('Key [tag]: ' + keyExist(obj, "tag")); console.log('Key [dog]: ' + keyExist(obj, "dog")); console.log('Key [rat]: ' + keyExist(obj, "rat"));

現在,讓我們在發現錯誤時拋出錯誤,處理並返回 true,否則返回 false

 var obj = { data: { cat: false, horse: { tag: 'somestring' }, dog: false } } function keyExist(object, key) { try { JSON.parse(JSON.stringify(object), function(k, v) { if(k===key) {throw v}; return v; }); } catch(e) {return true}; return false; }; console.log('Key [tag]: ' + keyExist(obj, "tag")); console.log('Key [dog]: ' + keyExist(obj, "dog")); console.log('Key [rat]: ' + keyExist(obj, "rat"));

但是,您在兩種情況下都有該值,第一種情況下的變量v和第二種情況下捕獲的變量e中,如果您想要該值,則可以返回該值。

但請記住,更簡單並不總是意味着更快。

正如您提到的,標簽將出現在任何“CAT/DOG/HORSE”中。 為什么不使用簡單的三元運算符

myObj.data.cat ? myObj.data.cat.tag : (myObj.data.horse ? myObj.data.horse.tag : (myObj.data.dog ? myObj.data.dog.tag : false));

您可以遞歸地使用 lodash 的_.some()來查找嵌套的屬性值:

 var obj = { data: { cat: false, horse: { tag: 'somestring' }, dog: false } }; function findProp(obj, prop) { var propValue; // the value that we'll return - undefined if prop wasn't found function iterate(obj) { // _.some can iterate arrays and objects, and will break immediately when true is returned return _.some(obj, function(value, key) { if(key === prop) { propValue = value; // update the propValue return true; // return true to finish the loop } // if the prop value is an object or an array iterate it or return false return _.isObject(value) ? iterate(value) : false; }); } iterate(obj); return propValue; } var result = findProp(obj, 'tag'); console.log(result);
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

我最終放棄了聰明並在快速循環中解決了它:

//lodash
let tag = false;
_.each(data, function (thing) {
   if (_.has(thing, 'tag')) {
      tag = thing.tag;
   }
});

從你額外輸入的角度來看,數據可以是兩層深的路徑data > horse > tag (或其他任何路徑)為什么不簡單地使用lodash的_.get函數和路徑?

例如

_.get(obj, 'data.horse.cat') !== undefined (假設你可能有假值但不是 undefined)

或者如果你有未定義值的可能性那么

'tag' in (_.get(obj, 'data.horse') || {})

這是一個工作片段:

 var obj = { data: { cat: false, horse: { tag: 'somestring' }, dog: false } } console.log('tag: ' + _.get(obj, 'data.horse.tag') ) // or if you just want to check the existance // considering it can contain undefined value as well console.log('tag: ' + ('tag' in _.get(obj, 'data.horse') || {}));
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM