All files / builds/1000i100/quiz-maker/src utilityFuncLib.mjs

0% Statements 0/69
0% Branches 0/1
0% Functions 0/1
0% Lines 0/69

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70                                                                                                                                           
export function scoreName(obj) {
	const scoreName = {};
	Object.keys(obj.options).filter(o=>o===o.toUpperCase()).forEach(o=>{
		const scoreInfo = scoreType2nameAndPosition(obj.options[o]);
		if(scoreInfo.name) scoreName[scoreInfo.name] = scoreInfo.position;
	});
	return scoreName;
}
export function scoreType2nameAndPosition(scoreType) {
	const tmp = scoreType.split(' ');
	const position = tmp.shift().split('-').map(str=>parseFloat(str));
	const name = tmp.join(' ');
	return {name,position};
}
export function questionCount(obj) { return obj.questions.length; }
export function scoreSum(score) { return score.reduce((acc,cur)=>acc+=cur,0); }
export function scoreStats(quoted,questionCount) {
	return {
		questionCount:questionCount,
		answeredCount:quoted.answered,
		scoreSum:quoted.score.reduce((acc,cur)=>acc+=cur,0)
	};
}
export function getUrlJson() { return JSON.parse(decodeURIComponent(location.hash).substr(1)); }
export function scoreQuotation(quotation,options){
	const score = [];
	Object.keys(quotation).forEach(scoreType=>{
		if(options[scoreType]){
			const scoreInfo = scoreType2nameAndPosition(options[scoreType]);
			scoreInfo.position.forEach((p,i)=>score[i]?score[i]+=quotation[scoreType]*p:score[i]=quotation[scoreType]*p)
		}
	});
	let scale = options.resultScaleFunc?Math[options.resultScaleFunc]:(x)=>x;
	return score.map(scale);
}
export function shuffle(a) {
	for (let i = a.length - 1; i > 0; i--) {
		const j = Math.floor(Math.random() * (i + 1));
		[a[i], a[j]] = [a[j], a[i]];
	}
	return a;
}
/**
 * object / array manipulation
 */
export function merge(...objs){
  return objs.reduce(merge2, {});
}
export function clone(json) {
  return JSON.parse(JSON.stringify(json))
}
export function merge2(acc, obj) {
  if(typeof acc !== "object") return clone(obj);
  if(!obj) return acc;
  if(obj.class && acc.class){
    let classes = {};
    acc.class.split(" ").forEach(c=>classes[c]=c);
    obj.class.split(" ").forEach(c=>classes[c]=c);
    obj.class = Object.keys(classes).join(' ');
  }
  let res = clone(acc);
  for (let key in obj) if(obj.hasOwnProperty(key)){
    if (typeof obj[key] === "object" && typeof res[key] !== 'undefined') {
      res[key] = merge2(res[key], obj[key]);
    }
    else res[key] = obj[key];
  }
  return res;
}