2017-03-10 4 views
0

このJavaScript配列のsortOrderプロパティの数値の空白を削除しようとしています。JavaScript配列を使用した数値ギャップの解決と除去

だから例えば:

p[0].sortOrder = 2; 
p[1].sortOrder = 12; 
p[2].sortOrder = 4; 
p[3].sortOrder = 8; 
p[4].sortOrder = 6; 
p[5].sortOrder = 2; 
p[6].sortOrder = 8; 

はに出力する必要があります。

p[0].sortOrder = 1; //used to be 2 
p[1].sortOrder = 5; //used to be 12 
p[2].sortOrder = 2; //used to be 4 
p[3].sortOrder = 4; //used to be 8 
p[4].sortOrder = 3; //used to be 6 
p[5].sortOrder = 1; //used to be 2 
p[6].sortOrder = 4; //used to be 8 

ここでそれがで実行する必要がある関数です私はの排除のまわりで私の頭をラップすることはできません。数字の隙間

function restackSortOrder(p) { 

    //Remove any gaps in numbers here while still retaining any duplicate numbers (which should stay grouped together). 

    return p; 
} 
+0

ギャップはここではどういう意味ですか? – Agalo

+0

ソート順があり、sortOrderプロパティで数値をスキップすることはできません。したがって、配列に2つのオブジェクト:p [0] .sortOrder = 1とp [1] .sortOrder = 3がある場合、3を2に変換して番号のギャップがないようにする必要があります。 – RichC

答えて

5

は、ここでコメントで説明して、ソリューションです:最初にマップするためにユニークなアイテムを取得するためにSetを使用して、Map

function resortStackorder(p) { 
 
    var match = p.map(function(e) {     //create array of sortOrder values 
 
       return e.sortOrder; 
 
       }) 
 
       .sort(function(a, b) {return a - b}) //sort the array numerically 
 
       .filter(function(e, idx, array) { //filter out duplicates 
 
       return e !== array[idx - 1]; 
 
       }); 
 

 
    p.forEach(function(e) { //look up sortOrder's position in the match array 
 
    e.sortOrder = match.indexOf(e.sortOrder) + 1; 
 
    }); 
 
} //resortStackorder 
 

 
var p = [ 
 
    {sortOrder: 2}, 
 
    {sortOrder: 12}, 
 
    {sortOrder: 4}, 
 
    {sortOrder: 8}, 
 
    {sortOrder: 6}, 
 
    {sortOrder: 2}, 
 
    {sortOrder: 8} 
 
]; 
 

 
resortStackorder(p); 
 

 
console.log(JSON.stringify(p));

1

アンES6バージョンがセットのインデックスを持つ元の値:

let p = [{sortOrder: 2},{sortOrder: 12},{sortOrder: 4},{sortOrder: 8},{sortOrder: 6},{sortOrder: 2},{sortOrder: 8}]; 
 

 
let map = new Map([...new Set(p.map(o=>o.sortOrder))].sort((a,b)=>a-b).map((sO,ind)=>[sO,ind+1])); 
 
for(let o of p) 
 
\t o.sortOrder = map.get(o.sortOrder); 
 

 
console.log(JSON.stringify(p));

関連する問題