0

I'm looking way to order data wich is coming from my JSON Provider:

[{"Username":"Mehmet","UserID":2,"OkeyTablePlayerChairNumber":1},
{"Username":null,"UserID":0,"OkeyTablePlayerChairNumber":2},
{"Username":"Erçin","UserID":1,"OkeyTablePlayerChairNumber":3},
{"Username":null,"UserID":0,"OkeyTablePlayerChairNumber":4},
{"Username":null,"UserID":0,"OkeyTablePlayerChairNumber":5},
{"Username":null,"UserID":0,"OkeyTablePlayerChairNumber":6},
{"Username":null,"UserID":0,"OkeyTablePlayerChairNumber":7},
{"Username":null,"UserID":0,"OkeyTablePlayerChairNumber":8},
{"Username":null,"UserID":0,"OkeyTablePlayerChairNumber":9}]

There is two more important thing for ordering:

  1. OkeyTablePlayerChairNumber
  2. By UserID First; let me explain:

I want to order them firstly by OkeyTableChairNumber; this is done by Server Side already. Data coming ordered by OkeyTablePlayerChairNumber ASC...

Now the bull, I would like to order them by UserID but; for example if I took UserID == 1 it should order them like: UserID == 1 field, will be come to first field. and upper objects will removed and added to end of the list...

For view:

UserID == 1

 [{"Username":"Erçin","UserID":1,"OkeyTablePlayerChairNumber":3},
 {"Username":null,"UserID":0,"OkeyTablePlayerChairNumber":4},
 {"Username":null,"UserID":0,"OkeyTablePlayerChairNumber":5},
 {"Username":null,"UserID":0,"OkeyTablePlayerChairNumber":6},
 {"Username":null,"UserID":0,"OkeyTablePlayerChairNumber":7},
 {"Username":null,"UserID":0,"OkeyTablePlayerChairNumber":8},
 {"Username":null,"UserID":0,"OkeyTablePlayerChairNumber":9},
 {"Username":"Mehmet","UserID":2,"OkeyTablePlayerChairNumber":1},
 {"Username":null,"UserID":0,"OkeyTablePlayerChairNumber":2}]

C# Solution I made before; But I need JS solutions:

int yourSitPositionIndex = playersOnTheTableWithEmpytPositions.ToList().FindIndex(x => x.UserID == userID);
var beforePlayers = playersOnTheTableWithEmpytPositions.ToList().GetRange(0, yourSitPositionIndex);
IEnumerable<tbl_Okey_TablePlayer> afterPlayers = playersOnTheTableWithEmpytPositions.Except(beforePlayers);
IEnumerable<tbl_Okey_TablePlayer> newPositions = afterPlayers.Concat(beforePlayers);
9
  • Why down vote, just explain. Commented Aug 23, 2014 at 21:28
  • 2
    (don't know about the downvotes) What have you tried? Is you data into a string or into a javascript object? Commented Aug 23, 2014 at 21:31
  • Thank you; my data came by jQuery.parseJSON(obj) (edit: btw I tried JSON.search but i'm newbie on json) Commented Aug 23, 2014 at 21:32
  • In your example, do you really need to have the elements with OkeyTablePlayerChairNumber=1 and OkeyTablePlayerChairNumber=2 at the very end, or having them anywhere after the UserID=1 element will be fine too? (And again, what have you tried?) Commented Aug 23, 2014 at 21:37
  • 1
    Not a duplicate, you can't solve this problem with a simple sort, since the initial state of the array has to be considered. Commented Aug 23, 2014 at 21:47

2 Answers 2

1

Conversion of your C# solution:

var wantedId = 1;

var index = 0, result;
//int yourSitPositionIndex = playersOnTheTableWithEmpytPositions.ToList().FindIndex(x => x.UserID == userID);
while (index < data.length && data[index].UserID != wantedId) index += 1;
if (index < data.length) {
    //var beforePlayers = playersOnTheTableWithEmpytPositions.ToList().GetRange(0, yourSitPositionIndex);
    var beforePlayers = data.slice(0, index);
    //IEnumerable<tbl_Okey_TablePlayer> afterPlayers = playersOnTheTableWithEmpytPositions.Except(beforePlayers);
    var afterPlayers = data.slice(index);
    //IEnumerable<tbl_Okey_TablePlayer> newPositions = afterPlayers.Concat(beforePlayers);
    result = afterPlayers.concat(beforePlayers);
} else {
    result = data;
}
  • There is no FindIndex in the core of javascript, so I did a while loop to find the index
  • I use .slice() to replace GetRange
  • Rest of the code should be clear enough. The all code could be simplified with libraries like underscore

Example fiddle

Sign up to request clarification or add additional context in comments.

Comments

0

If the goal is to order by UserID DESC, OkeyTable... ASC

You can define a customer sort function:

In action: http://repl.it/XZm

var json = [/*all your data */]
function idSort(a,b){
    if(a["UserID"] !== b["UserID"]){
        return b["UserID"] - a["UserID"];
    } else {
        return a["OkeyTablePlayerChairNumber"] - b["OkeyTablePlayerChairNumber"];
    }
}
var sorted = json.sort(idSort);

Results:

[ { Username: 'Mehmet', UserID: 2, OkeyTablePlayerChairNumber: 1 },
  { Username: 'Erçin', UserID: 1, OkeyTablePlayerChairNumber: 3 },
  { Username: null, UserID: 0, OkeyTablePlayerChairNumber: 2 },
  { Username: null, UserID: 0, OkeyTablePlayerChairNumber: 4 },
  { Username: null, UserID: 0, OkeyTablePlayerChairNumber: 5 },
  { Username: null, UserID: 0, OkeyTablePlayerChairNumber: 6 },
  { Username: null, UserID: 0, OkeyTablePlayerChairNumber: 7 },
  { Username: null, UserID: 0, OkeyTablePlayerChairNumber: 8 },
  { Username: null, UserID: 0, OkeyTablePlayerChairNumber: 9 } ]

Here is UserID ASC, OkeyTable...ASC:

function idSort(a,b){
    var notZero = (a["UserID"] > 0 && b["UserID"] > 0);
    var notEqual = (a["UserID"] !== b["UserID"]);
    if(notZero && notEqual){
        return a["UserID"] - b["UserID"];
    } else {
        return a["OkeyTablePlayerChairNumber"] - b["OkeyTablePlayerChairNumber"];
    }
}
var sorted = json.sort(idSort);

Results:

[ { Username: 'Erçin', UserID: 1, OkeyTablePlayerChairNumber: 3 },
  { Username: 'Mehmet', UserID: 2, OkeyTablePlayerChairNumber: 1 },
  { Username: null, UserID: 0, OkeyTablePlayerChairNumber: 2 },
  { Username: null, UserID: 0, OkeyTablePlayerChairNumber: 4 },
  { Username: null, UserID: 0, OkeyTablePlayerChairNumber: 5 },
  { Username: null, UserID: 0, OkeyTablePlayerChairNumber: 6 },
  { Username: null, UserID: 0, OkeyTablePlayerChairNumber: 7 },
  { Username: null, UserID: 0, OkeyTablePlayerChairNumber: 8 },
  { Username: null, UserID: 0, OkeyTablePlayerChairNumber: 9 } ]

In action: http://repl.it/XZm/1

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.