在JavaScript中对数字数组和对象数组进行排序

时间:2017-03-18 17:38:04

标签: javascript arrays

假设我生成了两个数组 一个包含数字数组的人:

[5.65, 3.25, 4.34, 6.78]

另一个包含对象的数组,其中包含一些信息

[car.object1, car.object2, car.object3, car.object4]

第二个数组中的对象与第一个数组中的数字有关。所以object1与5.65,object2到3.25等有关。

所以我想按升序对数组1进行排序,同时也对数组2进行排序。

所以结果应为:

[3.25, 4.34, 5.65, 6.78]

&安培;

[car.object2, car.object3, car.object1, car.object4]

我的方法:(您可以忽略以下答案,因为我认为这是错误的。它不起作用。)



var all = [];
var A = [5.65, 3.25, 4.34, 6.78];
var B = ['store.object1', 'store.object2', 'store.object3', 'store.object4'];

for (var i = 0; i < B.length; i++) {
  all.push({
    'A': A[i],
    'B': B[i]
  });
}

all.sort(function(a, b) {
  return a.A - b.A;
});

A = [];
B = [];

for (var i = 0; i < all.length; i++) {
  A.push(all[i].A);
  B.push(all[i].B);
}

console.log(A, B);
&#13;
&#13;
&#13;

4 个答案:

答案 0 :(得分:2)

您可以使用带索引的临时数组,并使用第一个数组的值对其进行排序。然后使用array1array2的值映射已排序的数组。

我为第二个数组使用字符串,而不是丢失对象。

var array1 = [5.65, 3.25, 4.34, 6.78],
    array2 = ['car.object1', 'car.object2', 'car.object3', 'car.object4'],
    temp = array1.map(function (_, i) { return i; });

temp.sort(function (a, b) { return array1[a] - array1[b]; });

array1 = temp.map(function (a) { return array1[a]; });
array2 = temp.map(function (a) { return array2[a]; });

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

答案 1 :(得分:1)

除非您想自己实现排序,否则一种简单的方法是将数字数组中的条目与对象数组中的条目(至少是简短的)组合,对其进行排序,然后(如果需要)提取结果:

&#13;
&#13;
// Setup
var car = {
  object1: {name: "object1"},
  object2: {name: "object2"},
  object3: {name: "object3"},
  object4: {name: "object4"}
};
var nums = [5.65, 3.25, 4.34, 6.78];
var objs = [car.object1, car.object2, car.object3, car.object4];

// Combine
var joined = [];
nums.forEach(function(num, index) {
  joined[index] = {num: num, object: objs[index]};
});

// Sort
joined.sort(function(a, b) {
  return a.num - b.num;
});

// Extract
nums = [];
objs = [];
joined.forEach(function(entry, index) {
  nums[index] = entry.num;
  objs[index] = entry.object;
});

console.log(nums);
console.log(objs);
&#13;
.as-console-wrapper {
  max-height: 100% !important;
}
&#13;
&#13;
&#13;

但是,我可能只是维护一个数组并将每个数字添加到其相关对象,而不是组合,排序和提取,所以它们总是一起旅行。

答案 2 :(得分:1)

以下是ES6的方法:

&#13;
&#13;
let a = [5.65, 3.25, 4.34, 6.78];
let b = [{ x:1 }, { x:2 }, { x:3 }, { x: 4}];

[a, b] = a.map( (n, i) => [n, b[i]] ) // zip the two arrays together
          .sort( ([n], [m]) => n-m ) // sort the zipped array by number
          .reduce ( ([a,b], [n, o]) => [[...a, n], [...b, o]], [[],[]] ); // unzip 

console.log(JSON.stringify(a));
console.log(JSON.stringify(b));
&#13;
&#13;
&#13;

答案 3 :(得分:0)

我已经帮助自己使用包含car.object作为关键字的对象并将其作为number作为值。似乎简单快捷的解决方案。

&#13;
&#13;
var obj = [{'car.object1': 5.65}, {'car.object2': 3.25}, {'car.object3': 4.34}, {'car.object4': 6.78}],
    objs = obj.sort((a,b) => a[Object.keys(a)] - b[Object.keys(b)]);
    
    console.log(objs.map(v => Object.keys(v)[0]));
    console.log(objs.map(v => v[Object.keys(v)]));
    console.log(objs);
&#13;
.as-console-wrapper {
  max-height: 100% !important;
}
&#13;
&#13;
&#13;