JavaScript, сартаваць 2 масіва ў залежнасці

на працягу некалькіх гадзін я спрабаваў высветліць, як сартаваць масіў 2 у залежнасці.

Скажам, у мяне ёсць 2 масіваў.

Першы з іх:

array1 = ['zzzzz', 'aaaaaa', 'ccccc'];

а другі:

array2 = [3, 7, 1];

I sort the first one with array1.sort(); and it becomes [aaaaaa, cccccc, zzzzzz] now what I want is that the second one becomes [7, 1, 3]

Я думаю, што гэта даволі просты, але я спрабую ажыццявіць гэта ў чымсьці трохі больш складаным, ім новае, і я трымаць пераблытаць рэчы.

дзякуй

12
Гэта, мне здаецца, што гэта амаль праблема пары ключ/значэнне. Дзе ааааа ключ на 7, CCCCC ключ для 1, і ZZZZZ ключ да 3. Ці мае ваш выпадак выкарыстання абсалютна патрабуюць, каб вы падтрымліваеце два асобных масіваў ці вы б быць адкрытымі для аб'яднання іх у адзіны масіў аб'ектаў, падобных: обр = [{ "ключ": "аааааа", "значэнне": 7}, { "ключ": "Zzzzzz", "значэнне": 3}, ..... & ZWNJ; ...]?
дададзена аўтар Mike Pugh, крыніца

10 адказы

Я б «маланка» іх у адзін масіў аб'ектаў, а затым адсартаваць, што з карыстацкай сартавання зваротнага выкліку, затым «распакаваць» іх назад у двух масівах вы хацелі:

var array1 = ['zzzzz', 'aaaaaa', 'ccccc'],
    array2 = [3, 7, 1],
    zipped = [],
    i;

for(i=0; i< rightArray1elem ? -1 : 1);
});

array1 = [];
array2 = [];
for(i=0; i

Вось працуе скрыпку .

11
дададзена

Вось простая функцыя, якая будзе рабіць трук:

function sortTogether(array1, array2) {
    var merged = [];
    for(var i=0; i< o2.a1) ? -1 : ((o1.a1 == o2.a1) ? 0 : 1)); });
    for(var i=0; i

Usage demo (fiddle here):

var array1 = ['zzzzz', 'aaaaaa', 'ccccc'];
var array2 = [3, 7, 1];
console.log('Before..: ',array1,array2);

sortTogether(array1, array2);//simply call the function

console.log('After...: ',array1,array2);

выхад:

Before..:  ["zzzzz", "aaaaaa", "ccccc"] [3, 7, 1]
After...:  ["aaaaaa", "ccccc", "zzzzz"] [7, 1, 3] 
2
дададзена

Вось простая функцыя, якая будзе рабіць трук:

function sortTogether(array1, array2) {
    var merged = [];
    for(var i=0; i< o2.a1) ? -1 : ((o1.a1 == o2.a1) ? 0 : 1)); });
    for(var i=0; i

Usage demo (fiddle here):

var array1 = ['zzzzz', 'aaaaaa', 'ccccc'];
var array2 = [3, 7, 1];
console.log('Before..: ',array1,array2);

sortTogether(array1, array2);//simply call the function

console.log('After...: ',array1,array2);

выхад:

Before..:  ["zzzzz", "aaaaaa", "ccccc"] [3, 7, 1]
After...:  ["aaaaaa", "ccccc", "zzzzz"] [7, 1, 3] 
2
дададзена

Замест двух масіваў прымітыўных тыпаў (радкі, лік) вы можаце стварыць масіў аб'ектаў, дзе адно ўласцівасці аб'екта радка (якая змяшчае «ааааа», «CCCCCC», «Zzzzzz») і іншае лік (7,1, 3). Такім чынам, вы будзеце мець толькі адзін масіў, які вы можна сартаваць па любой уласнасці і іншае маёмасць будзе заставацца ў сінхранізацыі.

1
дададзена

здагадка:

  • The arrays are the same length (this is implied by your question)
  • the contents can be compared with > and < (true in your example, but I wanted to make it clear that it was assumed here)

Такім чынам, мы можам выкарыстоўваць ўстаўкі роду.

var value,len = array1.length;
for (i=0; i < len; i++) {
        value = array1[i];
        for (j=i-1; j > -1 && array1[j] > value; j--) {
            array1[j+1] = array1[j];
            array2[j+1] = array2[j];
        }

        items[j+1] = value;
 }
1
дададзена
OP папрасіў магчымае рашэнне без завес
дададзена аўтар Yuriy Galanter, крыніца
Гэты код нават не працуе, апошні элементы не вызначаны ў любым месцы. Мяркуецца гэта быць array2 [J + 1] = значэнне ?
дададзена аўтар alexfernandez, крыніца
@YuriyGalanter «калі гэта магчыма я хацеў бы рашэнне толькі з" Форс "і калі» »няма, ён папрасіў аднаго завесамі
дададзена аўтар Ben McCormick, крыніца
@YuriyGalanter хоць ён цяпер выдалены ўсе спасылкі на завесы на ўсіх.
дададзена аўтар Ben McCormick, крыніца

здагадка:

  • The arrays are the same length (this is implied by your question)
  • the contents can be compared with > and < (true in your example, but I wanted to make it clear that it was assumed here)

Такім чынам, мы можам выкарыстоўваць ўстаўкі роду.

var value,len = array1.length;
for (i=0; i < len; i++) {
        value = array1[i];
        for (j=i-1; j > -1 && array1[j] > value; j--) {
            array1[j+1] = array1[j];
            array2[j+1] = array2[j];
        }

        items[j+1] = value;
 }
1
дададзена
OP папрасіў магчымае рашэнне без завес
дададзена аўтар Yuriy Galanter, крыніца
Гэты код нават не працуе, апошні элементы не вызначаны ў любым месцы. Мяркуецца гэта быць array2 [J + 1] = значэнне ?
дададзена аўтар alexfernandez, крыніца
@YuriyGalanter «калі гэта магчыма я хацеў бы рашэнне толькі з" Форс "і калі» »няма, ён папрасіў аднаго завесамі
дададзена аўтар Ben McCormick, крыніца
@YuriyGalanter хоць ён цяпер выдалены ўсе спасылкі на завесы на ўсіх.
дададзена аўтар Ben McCormick, крыніца

Проста так здарылася, у мяне быў некаторы стары код, які ляжыць вакол, што можа зрабіць трук:

function arrVirtualSortGetIndices(array,fnCompare){
    var index=array.map(function(e,i,a){return i;});
    fnCompare=fnCompare || defaultStringCompare;
    var idxCompare=function (aa,bb){return fnCompare(array[aa],array[bb]);};
    index.sort(idxCompare);
    return index;

    function defaultStringCompare(aa,bb){
        if(aa

На жаль, я не раблю «Fors». Прынамсі, калі я не павінен.

І скрыпку .


Акрамя таго, альтэрнатыва скрыпка , што сартуе вынікі, калі дадзены масіў аб'ектаў, як гэта:

дадзена:

var list = [
    {str:'zzzzz',value:3},
    {str:'aaaaa',value:7},
    {str:'ccccc',value:1}
];

выхады:

[
  {str: "aaaaa", value: 7},
  {str: "ccccc", value: 1},
  {str: "zzzzz", value: 3}
]
1
дададзена

Проста так здарылася, у мяне быў некаторы стары код, які ляжыць вакол, што можа зрабіць трук:

function arrVirtualSortGetIndices(array,fnCompare){
    var index=array.map(function(e,i,a){return i;});
    fnCompare=fnCompare || defaultStringCompare;
    var idxCompare=function (aa,bb){return fnCompare(array[aa],array[bb]);};
    index.sort(idxCompare);
    return index;

    function defaultStringCompare(aa,bb){
        if(aa

На жаль, я не раблю «Fors». Прынамсі, калі я не павінен.

І скрыпку .


Акрамя таго, альтэрнатыва скрыпка , што сартуе вынікі, калі дадзены масіў аб'ектаў, як гэта:

дадзена:

var list = [
    {str:'zzzzz',value:3},
    {str:'aaaaa',value:7},
    {str:'ccccc',value:1}
];

выхады:

[
  {str: "aaaaa", value: 7},
  {str: "ccccc", value: 1},
  {str: "zzzzz", value: 3}
]
1
дададзена

Выкарыстоўваючы знойдзенае рашэнне тут знайсці новыя індэксы пасля сартавання масіва, вы можаце ўжыць гэтыя індэксы да array2 як так.

function sortWithIndices(toSort) {
  for (var i = 0; i < toSort.length; i++) {
    toSort[i] = [toSort[i], i];
  }
  toSort.sort(function(left, right) {
    return left[0] < right[0] ? -1 : 1;
  });
  toSort.sortIndices = [];
  for (var j = 0; j < toSort.length; j++) {
    toSort.sortIndices.push(toSort[j][2]);
    toSort[j] = toSort[j][0];
  }
  return toSort;
}


var array1 = ['zzzz', 'aaaa', 'cccc'];
var array2 = [3, 7, 1];

// calculate the indices of array1 after sorting. (attached to array1.sortIndices)
sortWithIndices(array1);

// the final array after applying the sorted indices from array1 to array2
var final = [];

// apply sorted indices to array2
for(var i = 0; i < array1.sortIndices.length; i++)
    final[i] = array2[array1.sortIndices[i]];

// output results
alert(final.join(","));

<�Моцны> JSFiddle Demo

0
дададзена

Выкарыстоўваючы знойдзенае рашэнне тут знайсці новыя індэксы пасля сартавання масіва, вы можаце ўжыць гэтыя індэксы да array2 як так.

function sortWithIndices(toSort) {
  for (var i = 0; i < toSort.length; i++) {
    toSort[i] = [toSort[i], i];
  }
  toSort.sort(function(left, right) {
    return left[0] < right[0] ? -1 : 1;
  });
  toSort.sortIndices = [];
  for (var j = 0; j < toSort.length; j++) {
    toSort.sortIndices.push(toSort[j][2]);
    toSort[j] = toSort[j][0];
  }
  return toSort;
}


var array1 = ['zzzz', 'aaaa', 'cccc'];
var array2 = [3, 7, 1];

// calculate the indices of array1 after sorting. (attached to array1.sortIndices)
sortWithIndices(array1);

// the final array after applying the sorted indices from array1 to array2
var final = [];

// apply sorted indices to array2
for(var i = 0; i < array1.sortIndices.length; i++)
    final[i] = array2[array1.sortIndices[i]];

// output results
alert(final.join(","));

<�Моцны> JSFiddle Demo

0
дададзена