.fill () эквивалент для объектов - PullRequest
1 голос
/ 08 апреля 2019

Я пробовал прибегнуть к этому с помощью таких терминов, как «эквивалент заполнения для объектов», но он настаивает на том, чтобы показывать только результаты для массивов (что имеет смысл, поскольку это метод массива ).

Я знаю, если бы это был массив, я мог бы просто сделать array.fill(0, 0, 28);

Однако я хочу заполнить объект заранее определенным количеством ключей.Я мог бы использовать цикл, подобный;

let dateObj = {};
for(let i; i < 31; i++){
  // fill a key in my object with dateObj.i = ''
} 

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

Мой текущий объект выглядит так;

04-Apr-19: (40) [{…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}]
05-Apr-19: [{…}]

По сути, я хочу использовать его для заполнения графика за последние 30 дней.Однако, как видите, он содержит данные только за два дня.Поэтому мне нужно заполнить остальные 28/29 дней.

Есть идеи или мне просто нужно использовать цикл?

Ответы [ 2 ]

2 голосов
/ 08 апреля 2019

Вот небольшая вещь, которую я только что взбил

let obj = {
  '04-Apr-2019': [1, 2, 3],
  '05-Apr-2019': [4, 5, 6]
};
const fillMonth = (obj) => {
  // fix this - it may not be fully cross browser compatible
  let d = new Date(Object.keys(obj)[0].replace(/-/g, '/'));
  let year = d.getFullYear();
  d.setMonth(d.getMonth() + 1);
  d.setDate(0);
  let last = d.getDate();
  let txtMonth = d.toLocaleDateString('en', {month:'short'});
  return Array.from({
    length: last
  }, (_, i) => ({
    [`${(i+1).toString().padStart(2, '0')}-${txtMonth}-${year}`]: null
  }));
};
let newObj = Object.assign({}, ...fillMonth(obj), obj);
console.log(newObj);

Хотя для этого нужен хотя бы ОДИН ключ

Я предполагаю, что вы хотите "заполнить" месяц ключами

большая часть этого кода предназначена только для создания ключей "nn-mmm-yyyy" на полный месяц со значением NULL

Итак, хитрость и суть ответа:

let newObj = Object.assign({}, ...fillMonth(obj), obj);

используйте Object.assign, чтобы выполнить тяжелую работу за вас: сначала добавляются все ключи на каждый день месяца ...fillMonth(obj), затем добавляется исходный объект, перезаписывая все ключи значениями obj

Остальная часть кода на самом деле просто быстрый взлом, чтобы прочитать первый ключ, получить из него дату, вычислить, сколько дней в этом месяце, и создать массив объектов

1 голос
/ 08 апреля 2019

Нет встроенной функции в язык, который это делает. Тем не менее, вы можете очень легко построить свою собственную функцию для него.

без петли:

const fillObject = (number, seed = {}, startIndex = 0) => new Array(number).
    fill('').
    reduce((acc, _, i) => Object.assign(acc, {[i + startIndex]: _}), seed);

console.log(fillObject(28));
console.log(fillObject(26, {'0': '', '1': ''}, 2))

с петлей:

const fillObject = (number, seed = {}, startIndex = 0) => {
  const acc = seed;
  for (let i = 0; i <= number; i += 1) {
    acc[i + startIndex] = '';
  }
  return acc;
}

console.log(fillObject(28));
console.log(fillObject(26, {'0': '', '1': ''}, 2))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...