Извлекать уникальные значения из массива объектов на основе динамически переданного свойства - PullRequest
1 голос
/ 04 июля 2019

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

var arr = [
  {
    id: "1",
    type: "x",
    source: {
      val1: "3",
      val2: "4",
      val3: "6",
    },
  },
  {
    id: "1",
    type: "x",
    source: {
      val1: "3",
      val2: "4",
      val3: "6",
    },
  },
  {
    id: "1",
    type: "x",
    source: {
      val1: "4",
      val2: "5",
      val3: "6",
    }
  }
];

Теперь скажите, что я передаю val1, это должно дать мне уникальные значения 3,4, а если я передам val2, это должно дать мне 4,5. P.S: Я передам только параметр, который присутствует внутри свойства источника.

Подход, который я пробовал:

 calculate = (param) =>
 {
   let uniqueValues = Array.from(
        new Set(arr.map((arr: any) => arr[param]))
   );
 }

Ответы [ 2 ]

2 голосов
/ 04 июля 2019

Похоже, вам также нужно свойство source.

new Set(arr.map((o: any) => o.source[param]))
0 голосов
/ 04 июля 2019

Вы можете использовать map для получения исходных значений, а затем reduce нестандартных значений:

const arr = [
  {
    id: "1",
    type: "x",
    source: {
      val1: "3",
      val2: "4",
      val3: "6",
    },
  },
  {
    id: "1",
    type: "x",
    source: {
      val1: "3",
      val2: "4",
      val3: "6",
    },
  },
  {
    id: "1",
    type: "x",
    source: {
      val1: "4",
      val2: "5",
      val3: "6",
    }
  }
];

function calculate(data, param) {
  return data.map(x => {
    return (x.source || {})[param];
  }).reduce((acc, val) => {
    if (acc.indexOf(val) === -1)
      acc.push(val);
    return acc;
  }, []);
}

console.log(calculate(arr, "val1"));
console.log(calculate(arr, "val2"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...