Maxymiser task 06

by Vladimir

HTML

<h1>06 Задание. Функции</h1>

<h2>1. Создать массив из массивоподобного объекта</h2>
<p>Реализовать функцию toArray(obj), которая принимает аргументом массивоподобный объект (например arguments), и возвращает массив из тех же элементов, которые входили в массивоподобный объект.</p>
<code>function someFunc() {
    var args = toArray(arguments);
    console.log(arguments.forEach); // undefined, метод есть только у массивов.
    console.log(args.forEach); // [function], метод есть только у массивов.
}

someFunc(1,2,3,4);</code>

<h2>2. Преобразовать строку запроса (query string) в объект</h2>
<p>
    Реализуй функцию queryStringToObject(queryString), которая возвращает объект. Распознавать следующие типы данных: числа, строки, булевы. Помни, что некоторые символы query string могут быть закодированы.</p>

<code>queryStringToObject("user=true"); // {user: true}
queryStringToObject("user=true&age=29"); // {user: true, age: 29}
queryStringToObject("user=true&age=29&name=Evgen"); // {user: true, age: 29, name: "Evgen"}</code>

<h2>3. Найти и исправить объект в структуре</h2>
<p>Есть структура вида:</p>
<code>[{
    delta: 5,
    value: 5
}, {
    delta: -3,
    value: 2
}, {
    delta: 5,
    value: 7
}, {
    delta: 0,
    value: 7
    }]</code>
<p>Она подчиняется следющему правилу: каждый последующий объект массива содержит объект со свойствами delta и value. delta - разница значений value с предыдущим объектом.</p>
<p>У тебя есть экземпляр структуры, и достоверно известно, что один (и только один) из элементов имеет неверное значение delta и value, и что этот элемент не является ни первым, ни последним. Необходимо написать функцию fixStruct(struct), которая изменяет неверное значение таким образом, чтобы его delta и value снова подчинялись правилу, описанному выше.</p>
<code>var struct = [{
    delta: 0,
    value: 1
}, {
    delta: 0,
    value: 0
}, {
    delta: 3,
    value: 5
}];
console.log(fixStruct(struct));
/* [{
    delta: 0,
    value: 1
}, {
    delta: 1,
...

CSS

body {
    font-family: Verdana, sans-serif;
}
code {
    display: block;
    background: #EEE;
    white-space: pre;
    padding: 5px;
}

JavaScript

//* задача 1
function toArray(obj) {
	var arr = [];
	for(var i = 0; i < obj.length; i++) {
  	arr.push(obj[i]);
  }
  return arr;
    //more powerfull solution
    // return [].slice.apply(obj) || Array.prototype.slice.apply(obj)
}
//* Задача 2
function queryStringToObject(queryString) {
	var obj = {};
  if(queryString) {
  	var parts = queryString.split('&');
  	for(var i = 0 ; i < parts.length; i++) {
  		var subparts = parts[i].split('=');
      if(subparts[1] == 'true' || subparts[1] == 'false') {
      	subparts[1] = subparts[1] == 'true';
      } else if(parseFloat(subparts[1]) == subparts[1]) {
      	subparts[1] = parseFloat(subparts[1]);
      } else {
      	subparts[1] = decodeURIComponent(subparts[1]);
      }
    	obj[subparts[0]] = subparts[1];
  	}
  }
  return obj;
}
//* Задача 3
function fixStruct(struct) {
	for(var i = 1; i < struct.length-1; i++) {
  	if(struct[i].value != struct[i-1].value + struct[i].delta) {
    	struct[i].value = struct[i+1].value - struct[i+1].delta;
      struct[i].delta = struct[i].value - struct[i-1].value;
    }
  }
  return struct;
}
//* Задача 4
function getUnique(list) {
	var res = [];
  for(var i = 0; i < list.length; i++) {
  	var isExist = false;
    for(var j = 0; j < res.length; j++) {
    	if(res[j] === list[i]) {
      	isExist = true;
        break;
      }
    }
    if(!isExist) {
    	res.push(list[i]);
    }
  }
  return res;
}
//* Задача 5
function createSummator(initialValue) {
	var count = initialValue || 0;
  return {
  	inc: function(a) {
    	count += a || 1;
    },
    dec: function(b) {
    	count -= b || 1;
    },
    get: function() {
    	return count;
    }
  };
}