根据一个数组的长度对两个数组进行排序

时间:2018-04-06 11:41:02

标签: javascript arrays sorting

我有两个数组,数据合并,如: [maximilian,moritz,hans]和 [5,1,2000]

现在我必须根据名称的长度对第一个数组进行排序,并将数字保存在正确的位置。结果应该是: [汉斯,Moritz的,马西米兰] [2000,1,5]

通常,您可以组合两个数组,对它们进行排序然后将它们分开。简单。但在我的情况下,数字有不同的长度,所以正确的顺序是不能保证的。 如果我合并然后排序,结果将是: [莫里茨,汉斯,马西米兰] [1,2000,5] 这是错的。 任何人都知道如何解决这个问题?

4 个答案:

答案 0 :(得分:7)

您可以获取索引,对它们进行排序并映射两个数组的值。



var array1 = ['maximilian', 'moritz', 'hans'],
    array2 = [5, 1, 2000],
    indices = array1.map((_, i) => i);
    
indices.sort((a, b) => array1[a].length - array1[b].length);

array1 = indices.map(i => array1[i]);
array2 = indices.map(i => array2[i]);

console.log(array1);
console.log(array2);

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




答案 1 :(得分:0)

的形式创建单个对象数组
var array = [{name: hans, number: 2000}, {name: moritz, number: 1}, {name: maximilian, number: 5}];

然后您可以按键name排序,而不必担心数字

答案 2 :(得分:0)

您还可以使用Map对两个数组进行排序:



let a1 = ['maximilian', 'moritz', 'hans'],
    a2 = [5, 1, 2000];

(map => {
    a1.sort(({length:s1}, {length:s2}) => s1 - s2);
    a2 = a1.map(s => map.get(s));
})(new Map(a1.map((v, i) => [v, a2[i]])));

console.log(a1);
console.log(a2);

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




<强>文档:

答案 3 :(得分:-1)

我会创建一个对象数组,将两个数组合并为一个,然后按键对它们进行排序,然后再将它们拆分。

const arr1 = [ 'maximilian', 'moritz', 'hans' ]
const arr2 = [5, 1, 2000]

const tmp = [];

for (let i = 0; i < arr1.length; i++) {
    tmp.push({ key: arr1[i], val: arr2[i] });
}

tmp.sort((a, b) => a.val < b.val);

console.log(tmp);

const keys = tmp.reduce((sub, elem) => { sub.push(elem.key); return sub }, []);
const vals = tmp.reduce((sub, elem) => { sub.push(elem.val); return sub }, []);

console.log(keys);
console.log(vals);