Как сопоставить значения объекта с количеством вхождений его соответствующего ключа во всем массиве в виде массива? - PullRequest
0 голосов
/ 24 апреля 2020

Я пытался выяснить это пару дней. Ничего не получается.

Представьте, что у меня есть список таких объектов:

let myArray = [
    { 0: 6, 5: 6 },
    { 0: 4, 11: 2, 13: 5 },
    { 0: 2 },
    { 0: 3, 13: 5 },
    { 0: 3, 13: 5 },
    { 0: 2 },
    { 0: 4, 3: 3, 13: 5 },
]

Чего я хочу достичь:

{
    2: [],
    3: [],
    4: [],
    5: [],
    6: [],
}

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

Например, если Я беру первый объект в массиве, который является {0: 6, 5: 6}, я хочу сопоставить его значения (здесь 6) с числом вхождений этих ключей во всем массиве (myArray)

{
6: [number of occurrences of the key 0 in the whole array (ie. myArray) with value 6, number of occurrences of the key 5 in the whole array (ie. myArray) with value 6]


... like so

}



Таким образом, я хочу сгенерировать весь объект: результат будет таким:

{
    2: [no. of occurence of key 0 with value 2 in myArray, no. of occurence of key 3 with value 2 in myArray, no. of occurence of key 5 with value 2 in myArray, no. of occurence of key 11 with value 2 in myArray, no. of occurence of key 13 with value 2 in myArray],
    3: [no. of occurence of key 0 with value 2 in myArray, no. of occurence of key 3 with value 2 in myArray, no. of occurence of key 5 with value 2 in myArray, no. of occurence of key 11 with value 2 in myArray, no. of occurence of key 13 with value 2 in myArray],
    4: [no. of occurence of key 0 with value 4 in myArray, no. of occurence of key 3 with value 4 in myArray, no. of occurence of key 5 with value 4 in myArray, no. of occurence of key 11 with value 4 in myArray, no. of occurence of key 13 with value 4 in myArray],
    5: [no. of occurence of key 0 with value 5 in myArray, no. of occurence of key 3 with value 5 in myArray, no. of occurence of key 5 with value 5 in myArray, no. of occurence of key 11 with value 5 in myArray, no. of occurence of key 13 with value 5 in myArray],
    6: [no. of occurence of key 0 with value 6 in myArray, no. of occurence of key 3 with value 6 in myArray, no. of occurence of key 5 with value 6 in myArray, no. of occurence of key 11 with value 6 in myArray, no. of occurence of key 13 with value 6 in myArray],
}

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

Это будет здорово, если кто-то может помочь

Ответы [ 2 ]

1 голос
/ 24 апреля 2020

Прежде чем углубиться в этот путь, возможно, спросите себя, есть ли более простой способ решения проблемы, которую вы пытаетесь решить. Предполагаемая структура данных немного сбивает с толку. В любом случае я бы хотел вам помочь. Ниже я подхожу к проблеме:

const myArray = [
    { 0: 6, 5: 6 },
    { 0: 4, 11: 2, 13: 5 },
    { 0: 2 },
    { 0: 3, 13: 5 },
    { 0: 3, 13: 5 },
    { 0: 2 },
    { 0: 4, 3: 3, 13: 5 },
];

// key of result is val
// val is named tuple key 0, 3, 5, 11 occurence with key 

const process = (arr) => {
  return arr.reduce((acc, item) => {
    Object.entries(item).forEach(([key, val]) => {
      if (!acc[val]) {
        acc[val] = {};
      }
      if (!acc[val][key]) {
        acc[val][key] = 1;
      } else {
        acc[val][key] += 1;
      }
    });
    return acc;
  
  }, {});
};

console.log(process(myArray));
1 голос
/ 24 апреля 2020

Вы можете сначала подсчитать количество вхождений каждой пары key-value в ваших данных, затем получить отсортированные массивы уникальных ключей и значений, используя Set, а затем использовать метод Reduce для получения желаемого результата.

let data = [{ 0: 6, 5: 6 },{ 0: 4, 11: 2, 13: 5 },{ 0: 2 },{ 0: 3, 13: 5 },{ 0: 3, 13: 5 },{ 0: 2 },{ 0: 4, 3: 3, 13: 5 },]

const count = data.reduce((r, o) => {
  Object.entries(o).forEach(([k, v]) => {
    let key = `${k}-${v}`;
    if (!r[key]) r[key] = 0
    r[key] += 1
  })

  return r
}, {})

const keys = [...new Set([].concat(...data.map(Object.keys)))].map(Number).sort((a, b) => a - b)
const values = [...new Set([].concat(...data.map(Object.values)))].map(Number).sort((a, b) => a - b)

const result = values.reduce((r, v) => {
  r[v] = keys.map(k => count[`${k}-${v}`] || 0)
  return r;
}, {})

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