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

时间:2019-02-23 01:07:31

标签: javascript arrays find javascript-objects key-value

我正在尝试从下面的代码返回一个对象,该对象的键值对为name:sparky,并返回该对象的整个元数据和stats数组。

我不想使用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"
          }
        ]
      }

2 个答案:

答案 0 :(得分:1)

我想您可以执行以下操作:

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

这段代码的基本作用是,遍历所有对象并检查名称是否闪烁,如果是,则将其断开。如果要返回所有与名称匹配的匹配项,则需要将它们全部添加到另一个数组中并返回它。

答案 1 :(得分:0)

您可以简单地使用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)