Возврат объекта из массива, который соответствует ключу: значению пары объекта, вложенного в объект, который мне нужно вернуть - PullRequest
0 голосов
/ 28 февраля 2019

Желаемое состояние

Я пытаюсь вернуть объект из массива, который соответствует определенному значению, и я сталкиваюсь с некоторыми проблемами, потому что массив содержит объекты, вложенные в другой объект,Я хочу вернуть весь объект, но значение, которое мне нужно найти, находится внутри вложенного объекта.

Например, я пытаюсь вернуть весь этот объект, основываясь на значении пары ключ: значение"name": "Kills"

 {
    "metadata": {
        "key": "kills",
        "name": "Kills",
        "isReversed": false
    },
    "value": 1364,
    "displayValue": "1,364"
}

Формат массива

let stats = [
            {
                "metadata": {
                    "key": "kills",
                    "name": "Kills",
                    "isReversed": false
                },
                "value": 1364,
                "displayValue": "1,364"
            },
            {
                "metadata": {
                    "key": "score",
                    "name": "Score",
                    "isReversed": false
                },
                "value": 413743,
                "displayValue": "413,743"
            },
            {
                "metadata": {
                    "key": "matchesPlayed",
                    "name": "Matches Played",
                    "isReversed": false
                },
                "value": 2160,
                "displayValue": "2,160"
            }

        ]

Текущий код, который не работает

Я не настроен на использование кода этой структуры, любое решение, которое работает, прекрасно для меня, но мне нужно, чтобы оно было функцией, которую я могу использовать повторно.

function getStatsFields(value, statsSegment){
  console.log('getStatsFields ran', statsSegment.stats[0].metadata.name);

  console.log('statsSegment.stats.length', statsSegment.stats.length);
  var filteredStats = []
  for(var i=0; i < statsSegment.stats.length; ++i){
    const killsKey = Object.keys(statsSegment.stats[i].metadata.name)
    console.log('killsKey', killsKey);
    filteredStats = statsSegment.stats.filter(val => val[killsKey] === value)
    console.log('filteredStats before if', filteredStats);
    if(filteredStats.length){
      console.log('filteredStats[i]', filteredStats[i]);

      return filteredStats[i];
    }
  }

}

Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Если вы ищете метод фильтрации по паре метаданных (key, value), возможно, вам может помочь следующее:

const stats = [
  {
    "metadata": {
      "key": "kills",
      "name": "Kills",
      "isReversed": false
    },
    "value": 1364,
    "displayValue": "1,364"
  },
  {
    "metadata": {
      "key": "score",
      "name": "Score",
      "isReversed": false
    },
    "value": 413743,
    "displayValue": "413,743"
  },
  {
    "metadata": {
      "key": "matchesPlayed",
      "name": "Matches Played",
      "isReversed": false
    },
    "value": 2160,
    "displayValue": "2,160"
  }
];

const filterByMetaKeyVal = (arr, metakey, v) =>
{
    return arr.filter(({metadata}) => metadata[metakey] === v);
}

console.log(
  "Filter by [name, Kills]:",
  filterByMetaKeyVal(stats, "name", "Kills")
);
console.log(
  "Filter by [key, matchesPlayed]:",
  filterByMetaKeyVal(stats, "key", "matchesPlayed")
);
console.log(
  "Filter by [isReversed, true]:",
  filterByMetaKeyVal(stats, "isReversed", true)
);
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}
0 голосов
/ 28 февраля 2019

Попробуйте

stats.find(x=> x.metadata.name=="Kills");

let stats= [
            {
                "metadata": {
                    "key": "kills",
                    "name": "Kills",
                    "isReversed": false
                },
                "value": 1364,
                "displayValue": "1,364"
            },
            {
                "metadata": {
                    "key": "score",
                    "name": "Score",
                    "isReversed": false
                },
                "value": 413743,
                "displayValue": "413,743"
            },
            {
                "metadata": {
                    "key": "matchesPlayed",
                    "name": "Matches Played",
                    "isReversed": false
                },
                "value": 2160,
                "displayValue": "2,160"
            }

        ]
        
  let r= stats.find(x=> x.metadata.name=="Kills");
  console.log(r);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...