簡體   English   中英

從 JSON 嵌套 object 鍵中獲取值

[英]Get value from JSON nested object key

我正在嘗試編寫一個 function 獲取一個鍵(字符串)並返回它的值,如果它存在於 JSON 中。

收到 JSON:

[
  {
    "some_key1": [
      {"key": "value1"},
      {"key": "value2"},
      {"key": "value3"}
    ]
  },
  {
    "some_key2": [
      {"key": "value4"},
      {"key": "value5"},
      {"key": "value6"}
    ]
  },
  {
    "default_val": [
      {"key": "value7"},
      {"key": "value8"},
      {"key": "value9"}
    ]
  }
]

結構看起來像這樣,唯一可能不同的是內部對象的數量。

Function 將返回數組

interface InnerObject {
    key: string;
}

const getValues = (key = "default_val"): InnerObject[] => {
    /* working code */
}

預期的示例 output:

> getValues("some_key2");
[{"key": "value4"},{"key": "value5"},{"key": "value6"}]
> getValues();
[{"key": "value7"},{"key": "value8"},{"key": "value9"}]

任何優雅的解決方案?

與 Nick 相同的解決方案,但使用find直接返回 object:

 const data = [ { "some_key1": [ {"key": "value1"}, {"key": "value2"}, {"key": "value3"} ] }, { "some_key2": [ {"key": "value4"}, {"key": "value5"}, {"key": "value6"} ] }, { "default_val": [ {"key": "value7"}, {"key": "value8"}, {"key": "value9"} ] } ]; const getValues = (key = 'default_val') => data.find(o => Object.keys(o)[0] == key); console.log(getValues('some_key2')); console.log(getValues());

您可以使用Array.filter來測試 object 的鍵是否與傳遞的參數相同(如果未傳遞,則為default_val ):

 const data = [ { "some_key1": [ {"key": "value1"}, {"key": "value2"}, {"key": "value3"} ] }, { "some_key2": [ {"key": "value4"}, {"key": "value5"}, {"key": "value6"} ] }, { "default_val": [ {"key": "value7"}, {"key": "value8"}, {"key": "value9"} ] } ]; const getValues = (key = 'default_val') => data.filter(o => Object.keys(o)[0] == key); console.log(getValues('some_key2')); console.log(getValues());

如果有多個值具有相同的搜索鍵,此代碼將返回多個值。 如果不是,則使用Array.find更有效,如其他一些答案中所述。

這種結構不適合搜索。 為什么不先將其轉換為更好的結構,然后將其用於搜索?

這樣的事情可能會做:

 const makeSearcher = (input, obj = Object.assign (...input)) => (key) => obj [key] || obj.default_val const input = [{some_key1: [{key: "value1"}, {key: "value2"}, {key: "value3"}]}, {some_key2: [{key: "value4"}, {key: "value5"}, {key: "value6"}]}, {default_val: [{key: "value7"}, {key: "value8"}, {key: "value9"}]}] const search = makeSearcher (input) console.log (search ('some_key2')) console.log (search ())

這假設只有一個 object 具有給定的密鑰。 如果沒有,我會考慮尼克的解決方案。

雖然這是一個O (1)搜索 function,但對此的邏輯答案可能不會超過O (n) ,所以我真的不認為性能可能是一個大問題。

這將做:

const getValues = (key = "default_val"): InnerObject[] => {
  return data.find(item => item[key])[key];
};

這是使用對象掃描的更通用的解決方案

主要優點是它很容易定位,例如更深的鍵和多個鍵。

 // const objectScan = require('object-scan'); const myData = [{ some_key1: [{ key: 'value1' }, { key: 'value2' }, { key: 'value3' }] }, { some_key2: [{ key: 'value4' }, { key: 'value5' }, { key: 'value6' }] }, { default_val: [{ key: 'value7' }, { key: 'value8' }, { key: 'value9' }] }]; const find = (data, key) => objectScan([key], { reverse: false, rtn: 'value' })(data) console.log(find(myData, '[*].some_key2[*]')); // => [ { key: 'value4' }, { key: 'value5' }, { key: 'value6' } ]
 .as-console-wrapper {max-height: 100%;important: top: 0}
 <script src="https://bundle.run/object-scan@13.8.0"></script>

免責聲明:我是對象掃描的作者

暫無
暫無

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

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