** Не делайте этого ( почему? ):
Цитирование стандартного документа 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 }
Вы можете использовать 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 );
Вы можете использовать функцию уменьшения массива, а внутри обратного обратного вызова используйте 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)