[英]Javascript find object with matching property in array of objects and get another property if exists
[英]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.