оператор распространения, преобразующий объекты в массив

Я пытаюсь преобразовать структуру данных следующим образом:

data = { 
  0:{A:a}, 
  1:{B:b}, 
  2:{C:c}, 
}

в такую ​​структуру:

[
 {0:{A:a}},
 {1:{B:b}}, 
 {2:{C:c}},
]

Используя оператор распространения следующим образом: [...data] возвращает любой пустой массив.

Я также пробовал [{...data}]

Есть ли способ использовать оператор распространения для получения желаемого результата? Кроме того, почему этот подход не работает?


person Turnipdabeets    schedule 24.07.2017    source источник
comment
связаны ли числовые клавиши с индексами массива?   -  person Nina Scholz    schedule 24.07.2017


Ответы (3)


"Есть ли способ использовать оператор спреда для получения желаемого результата?" Краткий ответ: нет. (см. ниже альтернативное решение того, что вы пытаетесь выполнить)

"Кроме того, почему этот подход не работает?"

Это не работает, потому что согласно документам MDN

«Предложение Rest/Spread Properties для ECMAScript (этап 3) добавляет свойства распространения к литералам объектов. Оно копирует собственные перечисляемые свойства из предоставленного объекта в новый объект».

Как говорится в документах, в соответствии с «предложением по свойствам Rest/Spread», вы не можете распространять свойства объекта на массив, объекты всегда будут распространять свои свойства на новый объект. Точно так же массивы не будут распространяться на объект, они будут распространяться только на новый массив.

Альтернативное решение:

You can do this fairly easily with Object.keys().map(). Object.keys() will get an array of the keys of the object, and Array.map() will map them into an array of the desired structure, like so:

var data = { 
  0:{A:"a"}, 
  1:{B:"b"}, 
  2:{C:"c"}, 
}

var result = Object.keys(data).map(function (key) {
   return { [key]: data[key] };
});
console.log(result);

person mhodges    schedule 24.07.2017
comment
это не то, что происходит, и это не правильный ответ - person Christian Matthew; 29.12.2019
comment
ваш ответ буквально правильный, но он не объясняет ничего, что спрашивал ОП. Он спрашивал, почему оператор спреда не работает. Если вы можете объяснить это в своем ответе, я бы изменил ваш ответ на правильный. - person Christian Matthew; 30.12.2019
comment
@ChristianMatthew Почему этот код не работает? Вопрос не по теме. Реальный вопрос заключался в том, есть ли способ использовать оператор распространения для получения желаемого результата? И ответом было решительное нет. Чтобы быть более полезным, каждый предложил альтернативные решения для достижения одной и той же цели. Тем не менее, я сделал все возможное и объяснил, почему оператор спреда не работал в этом случае? ОП пытается распространить объект на массив, когда в документах (на которые я ссылался) четко указано, что объекты распространяются на новый объект, а не на массив. Не знаете, что еще вы ищете? - person mhodges; 30.12.2019
comment
я выделил ваш, потому что он был отмечен как правильный, и это добавляет путаницы, что это каким-то образом правильный ответ на то, что спросил ОП. Возможно, вопрос ОП был действительно о том, как мне это сделать, и снова ваш ответ правильный, но тогда его сообщение необходимо отредактировать, чтобы отразить это. В любом случае, когда я наткнулся на этот ответ, я обнаружил эти проблемы с тем, что спросил ОП, и с тем, как люди пытаются на него ответить. Это не информативно и могло быть - person Christian Matthew; 30.12.2019
comment
@ChristianMatthew отредактировано для ясности. В будущем для вас было бы полезнее попросить уточнить или разъяснить что-то в посте, а не говорить, что это не то, что происходит, и что это не правильный ответ, оба из которых являются заведомо ложными утверждениями, и ни один из них которые просят о том, что вам нужно, что является четким ответом на вопрос ОП. - person mhodges; 30.12.2019
comment
Это справедливо, и я обязательно сделаю это в следующий раз. Спасибо за редактирование. - person Christian Matthew; 30.12.2019

Вы можете использовать Object.entries для получения пары [ключ, значение] и сопоставьте их с массивом объектов с помощью вычисленные имена свойств:

const data = { 
  0:{A: 'a'}, 
  1:{B: 'b'}, 
  2:{C: 'c'}
};

const result = Object.entries(data).map(([key, value]) => ({ [key]: value }));

console.log(result);

person Ori Drori    schedule 24.07.2017

Боюсь, вы не можете использовать оператор распространения, как в вашем примере, однако вы можете получить желаемый результат с помощью reduce.

data = { 
  0:{A:'a'}, 
  1:{B:'b'}, 
  2:{C:'c'}, 
}

let resArr = Object.keys(data).reduce((arr, e) => {
  arr.push({[e]: data[e]});
  return arr;
}, []);

console.log(resArr);

person Olian04    schedule 24.07.2017
comment
Это дает буквальное свойство e для каждого объекта. Вам нужно добавить свойство динамически, используя синтаксис квадратных скобок, чтобы получить правильное имя свойства — arr.push({ [e]: data[e] }); - person mhodges; 24.07.2017