2016-12-06 5 views
5

У меня есть куча массивов в такой форме:Сортировка других массивов по порядку определенного массива?

var myRows = [ 
    [{idx: 0, val: 90}, {idx: 1, val: 75}, {idx: 2, val: 35}], 
    [{idx: 0, val: 50}, {idx: 1, val: 17}, {idx: 2, val: 95}], 
    [{idx: 0, val: 10}, {idx: 1, val: 24}, {idx: 2, val: 80}] 
    // ... 
]; 

позволяет сказать, что я хотел бы отсортировать первую строку в порядке возрастания val, поэтому она становится:

[{idx: 2, val: 35}, {idx: 1, val: 75}, {idx: 0, val: 90}] 

Есть простой способ сортировать оставшиеся массивы, чтобы их порядок соответствовал idx -order отсортированной первой строки?

myArrays = [ 
    [{idx: 2, val: 35}, {idx: 1, val: 75}, {idx: 0, val: 90}] 
    , [{idx: 2, val: 95}, {idx: 1, val: 17}, {idx: 0, val: 50}] 
    , [{idx: 2, val: 80}, {idx: 1, val: 24}, {idx: 0, val: 10}] 
    // ... 
]; 

Может быть, это возможно даже без idx собственности?

ответ

2

Вы можете использовать sorting with map и применить сопоставление для всех элементов.

Это предложение сохраняет индексы, заказывает массив и применяет порядок ко всем другим массивам.

// the array to be sorted 
 
var list = [[{ idx: 0, val: 90 }, { idx: 1, val: 75 }, { idx: 2, val: 35 }], [{ idx: 0, val: 50 }, { idx: 1, val: 17 }, { idx: 2, val: 95 }], [{ idx: 0, val: 10 }, { idx: 1, val: 24 }, { idx: 2, val: 80 }]]; 
 

 
// temporary array holds objects with position and sort-value 
 
var mapped = list[0].map(function (el, i) { 
 
    return { index: i, value: el.val }; 
 
}) 
 

 
// sorting the mapped array containing the reduced values 
 
mapped.sort(function (a, b) { 
 
    return a.value - b.value; 
 
}); 
 

 
// rearrange all items in list 
 
list.forEach(function (a, i, aa) { 
 
    aa[i] = mapped.map(function (el) { 
 
     return a[el.index]; 
 
    }); 
 
}); 
 

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

1

Когда вы удаляете свойство IDX, вы можете просто использовать массив:

// Function copied from here: http://stackoverflow.com/a/36164530/5710637 
 
var transpose = m => m[0].map((x,i) => m.map(x => x[i])) 
 

 
var sortByRow = 0  
 
var myRows = [ 
 
    [90, 75, 35], 
 
    [50, 17, 95], 
 
    [10, 24, 80] 
 
] 
 
var myCols = transpose(myRows) 
 
myCols.sort((x, y) => x[sortByRow] - y[sortByRow]) 
 
myRows = transpose(myCols) 
 
console.log(myRows)

1

Вы могли бы сделать что-то вроде этого.

var order = myRows[0].map(function(e) { return e.idx }) 
myRows.forEach(function(row) { 
    row.sort(function(a,b) { 
     return order.indexOf(a.idx) - order.indexOf(b.idx); 
    }); 
}); 

Это очень простой код, чтобы продемонстрировать идею. Вероятно, он будет медленным для очень больших массивов.

0

Используйте hash table создать критерии сортировки на основе первой строки - см демонстрационная ниже:

var myRows=[[{idx:0,val:90},{idx:1,val:75},{idx:2,val:35}],[{idx:0,val:50},{idx:1,val:17},{idx:2,val:95}],[{idx:0,val:10},{idx:1,val:24},{idx:2,val:80}]]; 
 

 
// sort the first row (as desired) 
 
myRows[0].sort((a,b) => a.val - b.val); 
 

 
myRows.forEach(function(c,i){ 
 
    if(i === 0){ 
 
     // create order criteria based on first row 
 
     c.forEach(function(e, k){ 
 
     this[e.idx] = k; 
 
     }); 
 
    } else { 
 
     c.sort(function(a,b) { 
 
     return this[a.idx] - this[b.idx]; 
 
     }); 
 
    } 
 
}, Object.create(null)); 
 
     
 
console.log(myRows);
.as-console-wrapper{top:0;max-height:100%!important;}

1

можно сделать следующие, .,

  • Сортировка первая строка массива , и хранить их idx эс во временном массиве
  • Присвоить оставшийся массив с temp имущества в соответствии с первым idx
  • Сортировка оставшийся массив на основе их temp (который основан на первом массиве)
  • Удалить temp недвижимость

Э.Г.

var filteredRows = []; 
 
var myRows = [ 
 
    [{idx: 0, val: 90}, {idx: 1, val: 75}, {idx: 2, val: 35}], 
 
    [{idx: 0, val: 50}, {idx: 1, val: 17}, {idx: 2, val: 95}], 
 
    [{idx: 0, val: 10}, {idx: 1, val: 24}, {idx: 2, val: 80}] 
 
]; 
 

 
/* 1. Sort the first row */ 
 
myRows[0].sort(function(a, b) { 
 
    return a.val - b.val; 
 
}); 
 
filteredRows.push(myRows[0]); 
 

 
/* 2. Get indexes */ 
 
var idxs = []; 
 
for (var obj of myRows[0]) { 
 
    idxs.push(obj.idx); 
 
} 
 

 
/* Handle the remaining array */ 
 
myRows.slice(1).map(function (val) { 
 
    /* 3. Assign temp value */ 
 
    val.map(function (obj, i) { 
 
     obj.temp = idxs[i]; 
 
    }); 
 

 
    /* 4. Sort them */ 
 
    val.sort(function (a, b) { 
 
     return a.temp - b.temp; 
 
    }); 
 

 
    /* 5. Remove temp value */ 
 
    val.map(function (obj, i) { 
 
     delete obj.temp; 
 
    }); 
 
}); 
 

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

Смежные вопросы