从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"}
]
}
]

结构看起来是这样的,唯一可能变化的是内部对象的数量。

返回的函数:
interface InnerObject {
key: string;
}
const getValues = (key = "default_val"): InnerObject[] => {
/* working code */
}

期望输出示例:

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

有什么好的解决方案吗?

与Nick相同的解决方案,但使用find直接返回对象:

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());

这种结构不适合搜索。为什么不先把它转换成一个更好的结构,然后用它来搜索呢?

可以这样做:

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 ())

假设只有一个对象具有给定的键。如果没有,我将考虑尼克的解决方案。

虽然这是一个O (1)搜索函数,但没有逻辑答案可能超过O (n),所以我真的不认为性能可能是一个大问题。

这样做:

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

您可以使用Array.filter来测试对象的键是否与传递的参数相同(如果没有传递,则使用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更有效,如其他一些答案所描述的。

下面是使用object-scan的更通用的解决方案

主要优点是很容易定位,例如更深的键和多个键。

// 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>

免责声明:我是object-scan的作者

最新更新