Use PHP functions in JavaScript
Can't find a function by ":usleep"

JavaScript usort

Sort an array by values using a user-defined comparison function

1
2
3
4
56
7
8
9
1011
12
13
14
1516
17
18
19
2021
22
23
24
2526
27
28
29
3031
32
33
34
3536
37
38
39
4041
42
43
44
4546
47
48
49
5051
52
53
54
5556
57
58
function usort (inputArr, sorter) {
    // Sort an array by values using a user-defined comparison function  
    // 
    // version: 1109.2015
    // discuss at: http://phpjs.org/functions/usort    // +   original by: Brett Zamir (http://brett-zamir.me)
    // +   improved by: Brett Zamir (http://brett-zamir.me)
    // %        note 1: This function deviates from PHP in returning a copy of the array instead
    // %        note 1: of acting by reference and returning true; this was necessary because
    // %        note 1: IE does not allow deleting and re-adding of properties without caching    // %        note 1: of property position; you can set the ini of "phpjs.strictForIn" to true to
    // %        note 1: get the PHP behavior, but use this only if you are in an environment
    // %        note 1: such as Firefox extensions where for-in iteration order is fixed and true
    // %        note 1: property deletion is supported. Note that we intend to implement the PHP
    // %        note 1: behavior by default if IE ever does allow it; only gives shallow copy since    // %        note 1: is by reference in PHP anyways
    // *     example 1: stuff = {d: '3', a: '1', b: '11', c: '4'};
    // *     example 1: stuff = usort(stuff, function (a, b) {return(a-b);});
    // *     results 1: stuff = {0: '1', 1: '3', 2: '4', 3: '11'};
    var valArr = [],        k = '',
        i = 0,
        strictForIn = false,
        populateArr = {};
     if (typeof sorter === 'string') {
        sorter = this[sorter];
    } else if (Object.prototype.toString.call(sorter) === '[object Array]') {
        sorter = this[sorter[0]][sorter[1]];
    } 
    // BEGIN REDUNDANT
    this.php_js = this.php_js || {};
    this.php_js.ini = this.php_js.ini || {};
    // END REDUNDANT    strictForIn = this.php_js.ini['phpjs.strictForIn'] && this.php_js.ini['phpjs.strictForIn'].local_value && this.php_js.ini['phpjs.strictForIn'].local_value !== 'off';
    populateArr = strictForIn ? inputArr : populateArr;
 
 
    for (k in inputArr) { // Get key and value arrays        if (inputArr.hasOwnProperty(k)) {
            valArr.push(inputArr[k]);
            if (strictForIn) {
                delete inputArr[k];
            }        }
    }
    try {
        valArr.sort(sorter);
    } catch (e) {        return false;
    }
    for (i = 0; i < valArr.length; i++) { // Repopulate the old array
        populateArr[i] = valArr[i];
    } 
    return strictForIn || populateArr;
}
external links: original PHP docs | raw js source

Examples

Running

1
2
stuff = {d: '3', a: '1', b: '11', c: '4'};
stuff = usort(stuff, function (a, b) {return(a-b);});

Should result in

1
stuff = {0: '1', 1: '3', 2: '4', 3: '11'};

Dependencies

No dependencies, you can use this function standalone.

Open syntax issues

php.js uses JsLint to help us keep our code consistent and prevent some common bugs.

Eventually we want all code to pass or at least take into consideration most fixes suggested by JsLint, following this JsLint configuration we’ve decided on.


Authors

Thanks to the following developers, you get to have usort goodness in JavaScript.

Comments

Add Comment
Use:
[CODE]
your_stuff('here');
[/CODE]
for proper code formatting
By submitting code here you are allowing us to use it in php.js hence dual licensing it under the MIT and GPL licenses

Gravatar
سياحة وسفر
Apr 4th Permalink

q  If I might —perhaps you should consider adding a few images. I don’t mean to disrespect what you’ve said ; its very enlightening, indeed. However, I think would respond to it more positively if they could be something tangible to your ideas

Gravatar
Brett Zamir
Mar 2nd Permalink

q  @Glen: Yes, you are right; as per the notes, this is only really useful for the likes of Firefox extensions (not sure if Mozilla will or has abandoned sorting order). See the array() function source code for the beginnings of an API to allow a more reliable though somewhat uglier syntax like: array({key1:value1}, {key2:value2}). Feel free to implement this using that syntax!

Gravatar
Glen
Mar 1st Permalink

q  This routine is strange in that it reads as if it should accept an array yet it returns an object. JS does not guarantee maintaining the order of elements of an object, and while it may work on some browsers, it should not be relied on. So it is pointless to sort an object. This routine should take an array and return an array ... and contain comments to indicate to the user that they shouldn't attempt to create a sorted object in JS. It works well in the PHP world, but unfortunately it doesn't translate directly to JS. In JS, you sometimes need to create an object store and an array store (to indicate order) to get direct access and order.


Contribute a New function