Возвращает значения из массива объектов

#javascript #arrays #object

#javascript #массивы #объект

Вопрос:

У меня есть следующая структура

    const objArray = [ { shiftId: 89192 },
       { shiftId: 89193 },
       { shiftId: 89190 } ]
  

Массив объектов.
Я пытаюсь отобразить и извлечь значение shiftId

Что я делаю, object.map(el=> Object.values(el)); но это сопоставление возвращает следующую структуру, потому что Object.values , к сожалению, возвращает массив.

 [ [ 89192 ], [ 89193 ], [ 89190 ] ]
  

Вложенные массивы, содержащие только один элемент.
Как я могу сопоставить это, чтобы возвращать только массив.

Комментарии:

1. пожалуйста, добавьте допустимый формат данных.

Ответ №1:

Вы могли бы получить свойство из первого найденного значения.

 var array = [{ anonymous: { shiftId: 89192 } }, { anonymous: { shiftId: 89193 } }, { anonymous: { shiftId: 89190 } }],
values = array.map(o => Object.values(o)[0].shiftId);

console.log(values);  

Ответ №2:

Если вы хотите извлечь shiftId свойство, просто укажите, что вы хотите извлечь это конкретное свойство, а не использовать Object.values :

 const shiftIds = object.map(({ shiftId }) => shiftId);
  

Обратите внимание, что у вас там есть массив — ваш код был бы более понятным, если бы вы вызывали переменную arrOfShiftObjs или что-то в этом роде, а не вызывали ее object .

Чтобы извлечь несколько значений из каждого элемента и поместить их в один больший массив, используйте flatMap :

 const arr = [{
    shiftId: 89192,
    id: 'id'
  },
  {
    shiftId: 89193,
    id: 'id'
  },
  {
    shiftId: 89190,
    id: 'id'
  }
];
const values = arr.flatMap(Object.values);
console.log(values);  

Или, если объекты также содержат другие свойства, которые вы не хотите включать, и вам нужны только shiftId и id :

 const arr = [{
    shiftId: 89192,
    id: 'id'
  },
  {
    shiftId: 89193,
    id: 'id'
  },
  {
    shiftId: 89190,
    id: 'id'
  }
];
const values = arr.flatMap(({ shiftId, id }) => [shiftId, id]);
console.log(values);  

Как и при использовании всех более новых функций, если вы хотите поддерживать браузеры, в которых этого еще нет, используйте полизаполнение. Конечно, вы также могли бы reduce вместо

 const arr = [{
    shiftId: 89192,
    id: 'id'
  },
  {
    shiftId: 89193,
    id: 'id'
  },
  {
    shiftId: 89190,
    id: 'id'
  }
];
const values = arr.reduce((a, { shiftId, id }) => {
  a.push(shiftId, id);
  return a;
}, []);
console.log(values);  

Комментарии:

1. Спасибо! Это работает… но почему, вы можете объяснить? Как мы можем вернуть только значение, а не весь объект, например?

2. Object.values возвращает массив всех значений объекта в форме массива. Если в объекте есть только одна пара ключ-значение, он вернет массив, содержащий одно значение. Если вы .map и обратный вызов возвращаете что-то из Object.values , вы получите вложенный массив, как вы видите. Итак, просто не используйте, Object.values если вы хотите извлечь только одно свойство из объекта — таким образом, .map обратный вызов возвращает интересующее вас простое значение , а не массив. (вы также можете вернуть Object.values(el)[0] , если вы заранее не знаете значение ключа)

3. Что, если бы мы хотели сделать то же самое, но у объекта были shiftId и Id, и нам нужны были оба, что бы мы могли сделать в этом случае?

4. Каким был бы ваш желаемый результат в этом случае? Все еще только один массив, содержащий числа?

5. Да, допустим, обычный массив.

Ответ №3:

С использованием деструктурирования объекта и Array.prototype.map

 let array = [{ anonymous: { shiftId: 89192 } }, { anonymous: { shiftId: 89193 } }, { anonymous: { shiftId: 89190 } }]

let out = array.map(({anonymous: {shiftId}}) => shiftId)
console.log(out)