Сделать 'значение' из [ключ, значение] пары в массив - PullRequest
1 голос
/ 01 апреля 2020

У меня есть простой объект, который я хочу превратить в пары значений ключа для отображения в SectionList.

const DOBBY = {
  foo: 'bar',
  toto: ['hoge', 'piyo'],
};

Я использовал Objects.entries(), чтобы превратить его в массив объектов:

const toArray = Object.entries(DOBBY).map(([ title, data ]) => ({ title, data }));

Чтобы я вернулся:

[
  { title: 'foo', data: 'bar' },
  { title: 'toto', data: ['hoge', 'piyo'] },
];

Прямо сейчас SectionList разбивает 'bar' на три строки.
Как мне поместить 'bar' в массив, чтобы я получил:

[
 { title: 'foo', data: ['bar'] },
 { title: 'toto', data: ['hoge', 'piyo'] },
]

Я думаю, Array.of() сделает это, но я не знаю, где это реализовать, или есть ли что я могу сделать с .map()

Ответы [ 2 ]

2 голосов
/ 01 апреля 2020

Вы можете просто принудительно вставить гнездо data в подмассив, а затем сгладить его, используя Array.prototype.flat:

  • Когда data является массивом, [data] будет массивом с единственным элементом, который также является массивом, поэтому Array.flat сведет его в массив
  • Когда data является строкой, [data] будет массивом строк, и Array.flat сохранит то, что есть

const DOBBY = {
  foo: 'bar',
  toto: ['hoge', 'piyo'],
};

const toArray = Object.entries(DOBBY).map(([ title, data ]) => ({ title, data: [data].flat() }));
console.log(toArray);

Конечно, вы также можете go для слегка длинного намотанного пути, но это означает, что вы не будете без необходимости вкладывать массив в массив:

const DOBBY = {
  foo: 'bar',
  toto: ['hoge', 'piyo'],
};

const toArray = Object.entries(DOBBY).map(([ title, data ]) => {
  return {
    title,
    data: Array.isArray(data) ? data : [data]
  };
});
console.log(toArray);

Метод Array.prototype.flat(), конечно, медленнее, потому что вы будете выполнять вложение дополнительного массива. Это жертва, которую вы платите за удобочитаемость. Кроме того, для очень маленьких объектов и массивов эти издержки производительности, вероятно, незначительны:

https://jsperf.com/array-prototype-flat-vs-isarray/

+---------------------------------+------------+------------+------------+
|               Test              | Chrome 80  | Firefox 74 | Safari 13  |
+---------------------------------+------------+------------+------------+
| Array.prototype.flat() approach | 640k ops/s | 2.4m ops/s | 590k ops/s |
| Array.isArray approach          | 2.6m ops/s | 2.7m ops/s | 650k ops/s |
+---------------------------------+------------+------------+------------+
0 голосов
/ 01 апреля 2020

Просто проверьте, является ли это массивом, если это так, просто вставьте данные, если не поместите данные в пустой массив

const DOBBY = {
  foo: 'bar',
  toto: ['hoge', 'piyo'],
};

const toArray = Object.entries(DOBBY)
.map(([title, data ]) => ({ title, data: Array.isArray(data) ? data : [data] }));

, это сработало для меня, поэтому я надеюсь, что это поможет:)

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