簡體   English   中英

查找對象是否具有值的最快方法是什么(多維對象)

[英]What is the fastest way of finding if object has a value (multidimensional object)

我有一個三維深度的多維物體。 我正在嘗試如果第3級對象具有給定值。 我想到的是循環遍歷每個級別並使用(Object.values(obj).indexOf('red') > -1)但據我所知,循環是一種緩慢的方式。

例如,在下面的對象中,檢查任何最內部值是否具有red值的最快方法是什么,返回布爾值?

myObj: {
   user1: {
      apples: {
        1: "red",
        2: "green",
        3: "black"
      },
      cherry: {
        2: "green"
        4: "dark"
      }
   },

   user2: {
     orange: {
        1: "orange"
     }
   }
}

這是一個遞歸方法,它使用Oject.values()Array.some()來檢查對象中是否存在值:

 const obj = {"user1":{"apples":{"1":"red","2":"green","3":"black"},"cherry":{"2":"green","4":"dark"}},"user2":{"orange":{"1":"orange"}}}; const findValue = (o, val) => Object.values(o) .some((v) => v && typeof(v) === 'object' ? findValue(v, val) : (v === val)); console.log(findValue(obj, 'red')); console.log(findValue(obj, 'gold')); 

您可以使用深度優先搜索並查找嵌套對象。

 function contains(object, value) { return Object.values(object).some( v => v && typeof v === 'object' ? contains(v, value) : v === value ); } var myObj = { user1: { apples: { 1: "red", 2: "green", 3: "black" }, cherry: { 2: "green", 4: "dark" } }, user2: { orange: { 1: "orange" } } }; console.log(contains(myObj, 'red')); console.log(contains(myObj, 42)); 

另一種解決方案可以是使用堆棧並執行線性搜索而無需重復。

這可以作為廣度優先搜索

 function contains(object, value) { var stack = Object.values(object), v; while (stack.length) { v = stack.shift(); if (v && typeof v === 'object') { stack.push(...Object.values(v)); continue; } if (v === value) { return true; } } return false; } var myObj = { user1: { apples: { 1: "red", 2: "green", 3: "black" }, cherry: { 2: "green", 4: "dark" } }, user2: { orange: { 1: "orange" } } }; console.log(contains(myObj, 'red')); console.log(contains(myObj, 42)); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

使用遞歸深度優先函數迭代鍵,然后在最深層,返回true 一個“問題”是確保字符串在迭代時不返回單個字符串,因為這將無限地遞歸。

 function hasKey(object, depth = 0) { if (depth === 0) { return true; } for (const key in Object(object)) { const value = object[key]; // prevent nested checks of characters in strings if (typeof value !== 'string' || value.length !== 1 || typeof object !== 'string') { if (hasKey(value, depth - 1)) { return true; } } } return false; } let myObj = {"user1":{"apples":{"1":"red","2":"green","3":"black"},"cherry":{"2":"green","4":"dark"}},"user2":{"orange":{"1":"orange"}}}; // has keys at depth 3 console.log(hasKey(myObj, 3)); // does not have keys at depth 4 console.log(hasKey(myObj, 4)); 

雖然這個答案在行計數中可能更長,但它確實在每個深度迭代鍵而不是將所有Object.values()緩沖到每個深度的數組中,這在技術上取消了其他答案能夠聲稱“深度”的資格 - 第一個“方法,因為緩沖導致”廣度優先“行為。

暫無
暫無

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

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