【问题标题】:Return object with specific key:value pair in an array nested in another array - Javascript返回具有特定键的对象:嵌套在另一个数组中的数组中的值对 - Javascript
【发布时间】:2019-02-23 01:07:31
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案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')
    

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

    【讨论】:

    • 感谢 kanhai,效果很好,我可以重用该函数来提取其他对象以获得特定值。感谢您的帮助!
    【解决方案2】:

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

    【讨论】:

    • 感谢您的帮助!问题是名称为 sparky 的对象并不总是位于数组中的 [0] 位置。它可能会改变,因为它是我从我无法控制的外部 API 中提取的数据。在这种情况下我将如何使用过滤器?
    • @bzlight 你可以检查更新。我希望它会有所帮助。
    猜你喜欢
    • 2020-10-19
    • 1970-01-01
    • 2021-07-03
    • 2015-03-31
    • 2019-03-29
    • 1970-01-01
    相关资源
    最近更新 更多