poniedziałek, 30 czerwca 2014

get nested property of object

Function that allows to get nested property of object. If it is not defined, function will return undefined.

var getProperty = function(obj, propertySrc) {
    var src = propertySrc.split('.');
    var res = obj;

    for (var i = 0, l = src.length; i < l; ++i) {
        if (!(src[i] in res)) {
            return void(0);
        }
        res = res[src[i]];
    }
    return res;
};
Working example: http://jsfiddle.net/gkucmierz/5Df5D/

niedziela, 23 lutego 2014

sort - stabilność sortowania

Kod JavaScript, którym można sprawdzić czy zaimplementowany algorytm sortowania jest stabilny czy nie.

var a = [
    {n: 1, str: 'first'},
    {n: 2, str: 'stable check 1'},
    {n: 2, str: 'stable check 2'},
    {n: 3, str: 'last'}
];

a.sort(function(a, b) {
    return a.n - b.n;
});

Przykład jsfiddle: http://jsfiddle.net/gkucmierz/WWGa8/1/

wtorek, 28 stycznia 2014

recursiveEach

recursiveEach - rekursywna iteracja po obiekcie. Funkcja do prawidłowego działania wymaga również 2 innych funkcji znajdujących się na tym blogu: getType oraz each.
Funkcję można dodatkowo rozbudować. Np. idealnie byłoby, gdyby w docelowej funkcji zamiast samej wartości klucza zwracała tablicę stringów wskazujących na ścieżkę do tego klucza w głównym obiekcie.

var recursiveEach = function recur(obj, fn, depth) {
  if (typeof depth === 'undefined')
    depth = -1;

  var res = {};

  if (getType(obj) === 'Object' && depth !== 0) {
    each(obj, function (el, key) {
      res[key] = recur(el, fn, depth - 1);
    });
    return res;
  }
  return fn(obj);
};

var getType = function (obj) {
  return ({}).toString.call(obj).slice(8, -1);
};

var each = function (obj, fn) {
  var res = {};
  for (var i in obj) {
    if (obj.hasOwnProperty(i)) {
      res[i] = fn.call(obj, obj[i], i);
    }
  }
  return res;
};

Przy pomocy tej funkcji łatwo zaimplementować funkcję flatten. Do funkcji flatten można przekazać zarówno obiekt jak i tablicę.
var flatten = function(obj) {
  var res = [];
  recursiveEach(obj, function(val) {
    res.push(val);
  });
  return res;
};