我需要通过一个target
值在多个数组中找到一个对象,并返回source
值。
数据如下:
{
"something": [
{
"type": "static",
"source": "data-access-select",
"target": "data-access-graphql"
},
{
"type": "static",
"source": "return-me",
"target": "find-me"
}
],
"anything": [
{
"type": "static",
"source": "data-access-page-index",
"target": "data-access-graphql"
}
]
}
所以有多个数组。
const depsBuffer = await readFile(
resolve('node_modules/.cache/nx/nxdeps.json')
)
const deps = JSON.parse(depsBuffer.toString('utf-8')).dependencies
for (const [key, value] of Object.entries(deps)) {
const res = value.find(x => x.target === 'find-me').source
console.log(res); // expected: 'return-me'
}
但是,这样我确实得到了ts错误Property 'find' does not exist on type 'unknown'
答案 0 :(得分:2)
const deps = {
"something": [
{
"type": "static",
"source": "data-access-select",
"target": "data-access-graphql"
},
{
"type": "static",
"source": "return-me",
"target": "find-me"
}
],
"anything": [
{
"type": "static",
"source": "data-access-page-index",
"target": "data-access-graphql"
}
]
};
const foundElement = Object.values(deps).flat().find(el => el.target === "find-me");
console.log(foundElement.source);
答案 1 :(得分:1)
该错误的原因是TypeScript不知道value
是一个数组。它会将value
视为unknown
。
尝试指定一种类型来描述JSON的预期形状
interface Dependencies {
[key: string]: Array<{
type: string,
source: string,
target: string
}>;
}
const depsBuffer = await readFile(
resolve('node_modules/.cache/nx/nxdeps.json')
);
const deps = JSON.parse(depsBuffer.toString('utf-8')).dependencies as Dependencies;
for (const [key, value] of Object.entries(deps)) {
const res = value.find(x => x.target === 'find-me').source;
console.log(res); // expected: 'return-me'
}
答案 2 :(得分:0)
您可以尝试以下代码:
const source = Object.values(deps).reduce((source, array) => {
const element = array.find(x => x.target === 'find-me');
if (element) return element.source;
else return source;
}, null);
或者这更类似于您的代码:
for (const [_, value] of Object.entries(deps)) {
const res = value.find(x => x.target === 'find-me');
// res is going to be undefined if in the array there is not an object with that target
if (res) console.log(res.source);
}
答案 3 :(得分:0)
使用Array.prototype.filter()
方法。如果找到目标,那么数组的第一个元素就是您的答案。
const array = "Your array here";
let result;
for (var key in array) {
result = array[key].filter(r => r.target === "find-me");
if(result.length > 0){
break;
}
}
if(result.length > 0){
console.log(result[0].source);
}