2016-10-07 1 views
-1

У меня есть 2 массива. Я хочу отсортировать только первый массив, а второй массив должен быть закорочен на базе первого массива.Как отсортировать второй массив, отсортировав первый с помощью Javascript или JQuery?

Перед сортировкой:

arrTexts = ["Company", "Department", "Account"]; 
arrValue = ["nameCompany", "department", "account"]; 

Должно быть, как это после короткого замыкания:

arrTexts = ["Account", "Company", "Department"]; 
arrValue = ["account", "nameCompany", "department"]; 

Я знаю, сортировать по arrTexts.sort(); Но это не так полезно в вышеописанном случае.

Пожалуйста, не массива длина может быть 300+. Таким образом, производительность (скорость сортировки) также сопрягается.

Может ли кто-нибудь предложить мне?

+1

пожалуйста, добавьте действительные JavaScript массивы. что вы подразумеваете под * сокращением *? –

+0

Почему второй массив не может быть отсортирован в первую очередь? .. Можете ли вы дать лучший пример для этого? И делай то, что сказала Нина, пожалуйста. используйте [] вместо {} –

+1

Как бы ваш метод сортировки * знал * какое имя, описание, учетную запись компании, если все элементы являются просто строками? – nem035

ответ

2

Вот код, чтобы начать работу.

var arrTexts = [ 
 
    "Company", "Department", "Account" 
 
]; 
 

 
var arrValue = [ 
 
    "nameCompany", "department", "account" 
 
]; 
 

 
var sortedArr1 = arrTexts.sort(); 
 

 
var sortedArr2 = []; 
 

 
sortedArr1.forEach(function(v, i) { 
 
    var t = arrValue.find(function(_v) { 
 
    return _v.toLowerCase().indexOf(v.toLowerCase()) > -1; 
 
    }); 
 
    sortedArr2.push(t); 
 
}); 
 

 
console.log(sortedArr1); 
 
console.log(sortedArr2);

+0

Я пробовал все решения. Самый быстрый во всех решениях. спасибо –

1

Вот способ сделать это:

arrTexts = ["Company", "Department", "Account"]; 
arrValues = ["nameCompany", "department", "account"]; 


arrTextsValues = {}; 
arrTexts.forEach(function(item, key){ 
    arrTextsValues[item] = arrValues[key]; 
}) 

arrTextsSorted = arrTexts.sort(); 
arrValuesSorted = []; 

arrTextsSorted.forEach(function(item){ 
    arrValuesSorted.push(arrTextsValues[item]); 
}) 

console.log(arrTextsSorted, arrValuesSorted); 

Он выводит это:

[ 'Account', 'Company', 'Department' ] 
[ 'account', 'nameCompany', 'department' ] 

Сначала я создать объект, который будет держать в переписку между текстами и значениями, то я отсортировать тексты и, наконец, я перебираю отсортированные тексты, чтобы создать массив, содержащий значения в правильном порядке, основанные на соответствующем объекте, созданном ранее.

Надеюсь, это поможет.

Я не знаю, соответствует ли это вашим потребностям в вопросах производительности. Это ваше, чтобы узнать :)

1

Вы можете использовать индексы в качестве временного массива и отсортировать его со значениями arrTexts. Затем сопоставьте результат с arrValue.

var arrTexts = ["Company", "Department", "Account"], 
 
    arrValue = ["nameCompany", "department", "account"], 
 
    indices = arrTexts.map(function (_, i) { return i; }), 
 
    values, 
 
    texts; 
 

 
indices.sort(function (a, b) { return arrTexts[a].localeCompare(arrTexts[b]); }); 
 
texts = indices.map(function (i) { return arrTexts[i]; }); 
 
values = indices.map(function (i) { return arrValue[i]; }); 
 

 
console.log(values); 
 
console.log(texts);

+0

Это решение может не работать, если порядок 2-го массива совпадает с 1-м массивом !! – Pugazh

+0

@ Пугаж, почему бы и нет? Я сортирую только «индексы», а не исходный массив, а затем создаю новый массив на основе индексов. –

1

var arrTexts = ["Company", "Department", "Account"]; 
 
    var arrValue = ["nameCompany", "department", "account"]; 
 
    
 
    
 
    // temporary array holds objects with position and sort-value 
 
    var mapped = arrTexts.map(function(el, i) { 
 
     return { index: i, value: el }; 
 
    }) 
 
    
 
    // sorting the mapped array containing the reduced values 
 
    mapped.sort(function(a, b) { 
 
     return +(a.value > b.value) || +(a.value === b.value) - 1; 
 
    }); 
 
    
 
    // container for the resulting order 
 
    var result = mapped.map(function(el){ 
 
     return arrValue[el.index]; 
 
    }); 
 
    console.log(result);

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