Return 嵌套在另一个数组中的数组中具有特定 key:value 对的对象 - Javascript

Return object with specific key:value pair in an array nested in another array - Javascript

我正在尝试 return 下面代码中的一个对象,该对象具有 name:sparky 的键值对和 return 该对象的整个元数据和统计数据数组。

我不想使用 Object.values(objectArray)[0],因为此数据来自 API,我希望数组中的对象位置将来会发生变化。

我试过 objectArray.find 但我不知道如何使用它来查找位于另一个数组内的数组的值。 name 的值将始终是唯一的,实际的 objectArray 中有更多的对象。

不胜感激!

代码

objectArray = [
  {
    "metadata": [
      {
        "key": '1',
        "name": "sparky"
      }
    ],
    "stats": [
      {
        "statsFieldOne": "wins"
      },
      {
        "statsFieldTwo": "kills"
      }
    ]
  },
  {
    "metadata": [
      {
        "key": '1',
        "name": "abby"
      }
    ],
    "stats": [
      {
        "statsFieldOne": "wins"
      },
      {
        "statsFieldTwo": "kills"
      }
    ]
  }
]

想要的结果

     {
       "metadata": [
          {
            "key": '1',
            "name": "sparky"
          }
        ],
        "stats": [
          {
            "statsFieldOne": "wins"
          },
          {
            "statsFieldTwo": "kills"
          }
        ]
      }

我猜你可以做以下事情:

function getObjectForName(key, name) {
    var filteredMetadata = [];
    for(var i=0; i< objectArray.length; i++) {
        filteredMetadata = objectArray[i].metadata.filter((val) => val[key] === name)
        if(filteredMetadata.length) {
            return objectArray[i];
        }   
    }
}
getObjectForName('name', 'sparky')

这段代码基本上做的是,遍历所有对象并检查名称是否有火花,如果是就打破它。如果你想 return 所有出现匹配的名字,你需要将它们全部添加到另一个数组并 return 它。

您可以简单地使用 Reduce

let objectArray = [{"metadata":[{"key":'1',"name":"sparky"}],"stats":[{"statsFieldOne":"wins"},{"statsFieldTwo":"kills"}]},{"metadata":[{"key":'1',"name":"abby"}],"stats":[{"statsFieldOne":"wins"},{"statsFieldTwo":"kills"}]}]

let op = objectArray.reduce(( op,{metadata,stats} ) =>{
  let found = metadata.find(({name})=>name==='sparky')
  if(found){
    op.push({metadata:found,stats})
  } 
  return op
},[])

console.log(op)