我有两个数组,数据合并,如: [maximilian,moritz,hans]和 [5,1,2000]
现在我必须根据名称的长度对第一个数组进行排序,并将数字保存在正确的位置。结果应该是: [汉斯,Moritz的,马西米兰] [2000,1,5]
通常,您可以组合两个数组,对它们进行排序然后将它们分开。简单。但在我的情况下,数字有不同的长度,所以正确的顺序是不能保证的。 如果我合并然后排序,结果将是: [莫里茨,汉斯,马西米兰] [1,2000,5] 这是错的。 任何人都知道如何解决这个问题?
答案 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);