通过特定键的值在多个数组中查找对象

时间:2020-10-07 22:02:32

标签: javascript typescript

我需要通过一个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'

4 个答案:

答案 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);
}