У меня есть массив вида:

[

    {
        foo:{
            name: 'One',
            value: 10
        },
        bar: {
            name: 'Two',
            value: 20
        }
    }

]

Я хочу получить массив вида:

[
    {
        name: 'One',
        value: 10
    },
    {
        name: 'Two',
        value: 20
    }
]

Могу ли я преобразовать его с помощью карты, например? Или мне нужен другой способ?

-3
Andrew Stark 19 Янв 2022 в 15:41
3
Object.entries
 – 
Najam Us Saqib
19 Янв 2022 в 15:43
Всегда ли первый массив содержит ровно один элемент?
 – 
jabaa
19 Янв 2022 в 15:47
Извините, я изначально указал неправильный тип массива. Исправлено
 – 
Andrew Stark
19 Янв 2022 в 15:49
- нет, не всегда
 – 
Andrew Stark
19 Янв 2022 в 15:52

4 ответа

Лучший ответ

Функция flatMap поддерживается не всеми версиями, вы можете проверить это

Вы можете попробовать эту функцию с примером поддерживаемых методов массива:

function transform(arr) {
   let empty = [];
   arr.forEach(obj => {
       const secondArr = Object.entries(obj);
       empty.push(...secondArr.map(arr => arr[1]));
   });
return empty;
}

Вот пример в JSFiddle PlayGround

1
sohaieb azaiez 19 Янв 2022 в 16:00
Это была ошибка, извините, я заменил на forEach
 – 
sohaieb azaiez
19 Янв 2022 в 15:58
Возвращаемый статус предназначен для функции «преобразование», а не для метода forEach
 – 
sohaieb azaiez
19 Янв 2022 в 15:59

РЕДАКТИРОВАТЬ: я видел, что вы исправили исходное сообщение, и этот ответ больше не актуален, потому что массив, который, я думаю, вы хотели определить, не тот, который вы действительно хотели. Я оставлю свой первоначальный ответ в образовательных целях, но для ответа на ваш вопрос я бы рекомендовал проверить ответ @terry-lennox https:// stackoverflow.com/a/70770819/12166040


Первый указанный вами массив недействителен: это будет означать, что оба элемента имеют следующую форму:

foo: {
    name: 'One',
    value: 10
}

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

{
    foo: {
        name: 'One',
        value: 10
    }
}

Итак, исходный массив должен быть:

[{
    foo: {
        name: 'One',
        value: 10
    }
}, {
    bar: {
        name: 'Two',
        value: 20
    }
}]

Имея это, ваша цель — получить объект первого ключа в каждом элементе массива. Вы можете сделать это следующим образом:

yourArray.map(item => item[Object.keys(item)[0]]);

map() вернет новый массив, запустив свой функциональный параметр для каждого элемента yourArray. И функция, указанная внутри map(), просто возвращает то, что находится внутри первого ключа каждого элемента.

1
TheMrAngel 19 Янв 2022 в 16:04
Спасибо, TheMrAngel.
 – 
Andrew Stark
19 Янв 2022 в 15:58

Ты можешь использовать

let data = [

  {
    foo: {
      name: 'One',
      value: 10
    },
    bar: {
      name: 'Two',
      value: 20
    }
  }

];

console.log(
  Object.values(data).map(i => {
    return Object.values(i);
  }).flat()
);
0
evolutionxbox 19 Янв 2022 в 16:36
Пожалуйста, объясните, почему они могут использовать это?
 – 
evolutionxbox
19 Янв 2022 в 16:37
Поскольку функция карты будет возвращать результаты в виде вложенных массивов. Нас интересует только ценностная часть объекта, присутствующая в объекте. Таким образом, мы можем использовать объекты. значения, чтобы получить это. В конце концов, мы можем сгладить вложенный массив, чтобы получить требуемый результат.
 – 
PankajPande007
19 Янв 2022 в 16:50
(Извините, я имел в виду, вы можете отредактировать ответ)
 – 
evolutionxbox
19 Янв 2022 в 16:51