Объединять и суммировать объекты массива Javascript

** Не делайте этого ( почему? ):

Цитирование стандартного документа C99, который я нашел в Интернете: «Установка индикатора положения файла для завершения -файла, как и в файле fseek (файл, 0, SEEK_END), имеет неопределенное поведение для двоичного потока (из-за возможных завершающих нулевых символов) или для любого потока с зависящей от состояния кодировкой, которая не обязательно заканчивается в начальном состоянии сдвига . **

Измените определение на int, чтобы сообщения об ошибках могли быть переданы, а затем используйте fseek () и ftell () для определения размера файла.

int fsize(char* file) {
  int size;
  FILE* fh;

  fh = fopen(file, "rb"); //binary mode
  if(fh != NULL){
    if( fseek(fh, 0, SEEK_END) ){
      fclose(fh);
      return -1;
    }

    size = ftell(fh);
    fclose(fh);
    return size;
  }

  return -1; //error
}

-6
задан LHM 18 March 2019 в 18:26
поделиться

2 ответа

Вы можете использовать Array # lower для построения тегов сопоставления объектов с счетчиками, а затем использовать Object.entries с Array # map для преобразования объекта обратно к вашей исходной структуре массива "

let data = [{
    "tag": "#sala",
    "state": {
      "counter": 1
    }
  },
  {
    "tag": "#sala",
    "state": {
      "counter": 2
    }
  }
];

let newData = data.reduce(
  ( obj, { tag, state: { counter } } ) => ( obj[ tag ] = counter + (obj[ tag ] || 0), obj ), { }
);

// Object mapping tags to counter sums
console.log( newData );

// If you need your original array structure:
newData = Object.entries( newData ).map( ( [ key,value ]) => ( { tag: key, state: { counter: value } } ) );

console.log( newData );

0
ответ дан Paulpro 18 March 2019 в 18:26
поделиться

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

let data = [{
    "tag": "#sala",
    "state": {
      "counter": 1
    }
  },
  {
    "tag": "#sala",
    "state": {
      "counter": 2
    }
  }
];
let newData = data.reduce(function(acc, curr) {
  let findTagIndex = acc.findIndex(item => item.tag === curr.tag);
  if (findTagIndex === -1) {
    acc.push(curr)
  } else {
    acc[findTagIndex].state.counter += curr.state.counter
  }
  return acc;
}, []);
console.log(newData)

0
ответ дан brk 18 March 2019 в 18:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: