2017-02-22 19 views
0

私はこのような配列を受け取り:JavaScript - 数字の文字列で配列の配列をソートするには?

[ 
    [{"name":"one","team":"------","checked":false,"position":"-"}, 
    {"name":"two","team":"------","checked":false,"position":"1"}], 
    [{"name":"three","team":"------","checked":false,"position":"3"}, 
    {"name":"four","team":"------","checked":false,"position":"7"}] 
] 

Iが最終的な出力は次のようになりたい:

[ 
    [{"name":"two","team":"------","checked":false,"position":"1"}, 
    {"name":"four","team":"------","checked":false,"position":"7"}], 
    [{"name":"three","team":"------","checked":false,"position":"3"}, 
    {"name":"one","team":"------","checked":false,"position":"-"}] 
] 

アレイが最大位置値と最小位置の値によってソートされていることを意味します前記第2のサブアレイ内の前記第2の最大位置値と前記第2の最小位置値とに基づいて、位置に " - "がある場合、文字列番号の後ろに残ります。

は、これまでのところ私はlodashでこれを試してみました:

var mergedArray = vm.roundOf4[0].concat(vm.roundOf4[1]); 
var count = _.countBy(mergedArray, {position: '-'}); 

var ascArray = _.cloneDeep(mergedArray); 
var descArray = _.cloneDeep(mergedArray); 

_.sortByOrder(ascArray, 'position', 'asc'); 
_.sortByOrder(descArray, 'position', 'desc'); 

_.times(count.true, ascArray.push(ascArray.shift())); 

vm.roundOf4.some(function (array, i) { 
    array.some(function (object, j) { 

     if (j === 0) { 
      vm.roundOf4[i][j] = ascArray[i]; 

     } else if (j === 1) { 
      vm.roundOf4[i][j] = descArray[i]; 
     } 

    }); 
}); 

しかし機能による昇順ソートが正しくソートされていない位置の値を、それがランダムソートを与えているよう。位置が文字列の値なので、私はそれがわからない。

代わりに数字を使用する必要がありますか?

+2

'1'と '-'は同じサブ配列ではなく、それらが分離しているご希望の出力にありました。その背後にある論理は何ですか? –

+0

論理はありません。 " - "はまだ設定されていません。それは別の番号でも構いませんが、まだ設定されていないので、最後に残っていますので、どのオブジェクトにも同じことが適用されます。 – forkfork

+1

'-'については言及していませんが、私は、' 1'と '-'がソートの後にどのように離れているのか話しています! (**前:**同じサブアレイにあった**後:**それぞれ異なるサブアレイに行きました)! '7'と' 3'と同じです! –

答えて

0

// get an array of object an return the min index or the max index depending on the parameter max (true => max index, false => min index) 
 
function minMax(arr, max) { 
 
    var index = 0;            // assuming the index 0 is the min or max 
 
    for (var i = 1; i < arr.length; i++) {      // for each other object in the array 
 
    if(arr[index].position == '-')       // if the position of the object at index index is '-' then assume the index is this i (before starting the comparison, find an item which have a number for its position property) 
 
     index = i; 
 
    else if ((arr[i].position > arr[index].position) == max) // now that the object at index index has a valid position property, make the comparison depending on the argument max 
 
     index = i; 
 
    } 
 
    return index; 
 
} 
 

 
// take an two dimensional array and rearrange it 
 
function reArrange(arr) { 
 
    var simple = arr.reduce(function(acc, a) {     // first let's make the two dimensional array into a one dimensional array 
 
    return acc.concat(a); 
 
    }, []); 
 
    
 
    var result = [];           // the result array 
 
    while(simple.length) {          // while there is element in the one dimensional array 
 
    var min = minMax(simple, false);       // get the min index 
 
    var max = minMax(simple, true);       // get the max 
 
    result.push([           // push the items at the min and max indexes as a sub-array of the result array 
 
     simple.splice(min, 1)[0],        // splice to remove it from simple array as well 
 
     simple.splice((max < min)? max: max - 1, 1)[0]   // if max index is after min index then substract one because the above splice shrank the array 
 
    ]); 
 
    } 
 
    return result; 
 
} 
 

 

 

 
var arr = [ 
 
    [{"name":"one","team":"------","checked":false,"position":"-"}, 
 
    {"name":"two","team":"------","checked":false,"position":"1"}], 
 
    [{"name":"three","team":"------","checked":false,"position":"3"}, 
 
    {"name":"four","team":"------","checked":false,"position":"7"}] 
 
]; 
 

 
console.log(reArrange(arr));

0

あなたは、ソート内部配列を使用することができ、その後、ソート再びつながるとして割り当てます。

var data = [[{ "name": "one", "team": "------", "checked": false, "position": "-" }, { "name": "two", "team": "------", "checked": false, "position": "1" }], [{ "name": "three", "team": "------", "checked": false, "position": "3" }, { "name": "four", "team": "------", "checked": false, "position": "7" }]], 
 
    result = []; 
 

 
data.forEach(function (a) { 
 
    a.sort(function (a, b) { return (+b.position || Number.MIN_VALUE) - (+a.position || Number.MIN_VALUE); }); 
 
}); 
 

 
data.forEach(function (a, i) { 
 
    a.forEach(function (b, j) { 
 
     result[j] = result[j] || []; 
 
     result[j][i] = b; 
 
    }); 
 
}); 
 

 
result.forEach(function (a) { 
 
    a.sort(function (a, b) { return (+a.position || Number.MAX_VALUE) - (+b.position || Number.MAX_VALUE); }); 
 
}); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

関連する問題