Получить ключи первого объекта в объекте массивов - PullRequest
1 голос
/ 10 октября 2019

Я пытаюсь получить массив (различных) ключей из массива объектов.

arr =[
   {id: 1, desc: "", name: "", objectives: Array(3), …},
   {id: 2, desc: "", name: "", objectives: Array(3), …},
   {id: 3, desc: "", name: "", objectives: Array(3), …},
   {id: 4, desc: "", name: "", objectives: Array(3), …},
]

Желаемый вывод - [id, desc, name, Задачи]. Я пытался:

Object.keys(arr)[0]
// output [{id: 1, desc: "", name: "", objectives: Array(3), …}]

arr.flatMap(Object.key)
// output ["id", "desc", "name", "objectives", "id", "desc", "name", "objectives", "id", "desc", "name", "objectives", "id", "desc", "name", "objectives"]

Извините, если я пропустил ответ на это, когда чистил SO. Любая помощь будет очень признательна.

Ответы [ 3 ]

2 голосов
/ 10 октября 2019

Вы можете использовать Set, чтобы отсеять дубликаты:

const arr = [
   {id: 1, desc: "", name: "", objectives: []},
   {id: 2, desc: "", name: "", objectives: []},
   {id: 3, desc: "", name: "", objectives: []},
   {id: 4, desc: "", name: "", objectives: []},
];

const keys = [...new Set(arr.flatMap(Object.keys))];

console.log(keys);
1 голос
/ 10 октября 2019

Это должно работать.

arr = [
   {id: 1, desc: "", name: "", objectives: Array(3)},
   {id: 2, desc: "", name: "", objectives: Array(3)},
   {id: 3, desc: "", name: "", objectives: Array(3)},
   {id: 4, desc: "", name: "", objectives: Array(3)},
];

keyArr = [];
Object.keys(arr).find(keys => {
    Object.keys(arr[keys]).find(key => {
    keyArr.push(key);
  });
})
console.log(keyArr);
0 голосов
/ 10 октября 2019
    const arr =[
      {id: 1, desc: "", name: "", objectives: Array(3), …},
      {id: 2, desc: "", name: "", objectives: Array(3), …},
      {id: 3, desc: "", name: "", objectives: Array(3), …},
      {id: 4, desc: "", name: "", objectives: Array(3), …},
    ];

    let distinct = function(arr, key_name) {
       let seen_values = [];
       let unique_objects = [];
       for(i = 0; i < arr.length; i++) {
         // If this value is new, a.k.a. distinct then add it to our filtered list.
         if(!seen_values.includes(arr[i][key_name]) {
            unique_objects.push(arr[i])
         }
         // Add this value to our seen values.
         seen_values.push(arr[i][key_name])
       }
       return unique_objects;
    }

    // Example usage, filter by desc
    let filtered_set = distinct(arr, "desc")

    // Example usage, filter by id
    let filtered_set_2 = distinct(arr, "id")

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

...