[英]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.