是否有可能对一个数组进行排序和重排,看起来像这样:
itemsArray = [
['Anne', 'a'],
['Bob', 'b'],
['Henry', 'b'],
['Andrew', 'd'],
['Jason', 'c'],
['Thomas', 'b']
]
要匹配此数组的排列:
sortingArr = [ 'b', 'c', 'b', 'b', 'a', 'd' ]
不幸的是,我没有任何身份证件可以追踪。我需要优先考虑items-array以尽可能接近地匹配sortingArr。
更新:
以下是我正在寻找的输出:
itemsArray = [
['Bob', 'b'],
['Jason', 'c'],
['Henry', 'b'],
['Thomas', 'b']
['Anne', 'a'],
['Andrew', 'd'],
]
知道该怎么做吗?
案例1:原始问题(没有图书馆)
还有很多其他有用的答案。:)
案例2:原始问题(Lodash.js或Underscore.js)
var groups = _.groupBy(itemArray, 1);
var result = _.map(sortArray, function (i) { return groups[i].shift(); });
情形3:把Array1当作Array2来排序
我猜大多数人来这里是为了寻找PHP的array_multisort(我做过),所以我想我也会把这个答案贴出来。这里有几个选项:
1. 有一个现有的JS实现array_multisort()。感谢@Adnan在评论中指出这一点。不过,它相当大。
2. 自己写。(JSFiddle演示)
function refSort (targetData, refData) {
// Create an array of indices [0, 1, 2, ...N].
var indices = Object.keys(refData);
// Sort array of indices according to the reference data.
indices.sort(function(indexA, indexB) {
if (refData[indexA] < refData[indexB]) {
return -1;
} else if (refData[indexA] > refData[indexB]) {
return 1;
}
return 0;
});
// Map array of indices to corresponding values of the target array.
return indices.map(function(index) {
return targetData[index];
});
}
3.Lodash.js或Underscore.js(都是关注性能的流行的小型库)提供了帮助函数,允许您这样做:
var result = _.chain(sortArray)
.pairs()
.sortBy(1)
.map(function (i) { return itemArray[i[0]]; })
.value();
...这将(1)将sortArray分组为[index, value]对,(2)根据值对它们排序(你也可以在这里提供一个回调),(3)将每个对替换为itemArray中该对起源于索引处的项。
这似乎对我很管用:
var outputArray=['10','6','8','10','4','6','2','10','4','0','2','10','0'];
var template=['0','2','4','6','8','10'];
var temp=[];
for(i=0;i<template.length;i++) {
for(x=0;x<outputArray.length;x++){
if(template[i] == outputArray[x]) temp.push(outputArray[x])
};
}
outputArray = temp;
alert(outputArray)
我必须为从API接收到的JSON有效负载这样做,但它不是我想要的顺序。
数组作为参考数组,你想要排序的第二个数组:
var columns = [
{last_name: "last_name"},
{first_name: "first_name"},
{book_description: "book_description"},
{book_id: "book_id"},
{book_number: "book_number"},
{due_date: "due_date"},
{loaned_out: "loaned_out"}
];
我把它们作为对象是因为它们最终会有其他属性。
创建数组:
var referenceArray= [];
for (var key in columns) {
for (var j in columns[key]){
referenceArray.push(j);
}
}
与数据库中的结果集一起使用。我不知道它的效率如何,但由于我使用的列的数量很少,它工作得很好。
result.forEach((element, index, array) => {
var tr = document.createElement('tr');
for (var i = 0; i < referenceArray.length - 1; i++) {
var td = document.createElement('td');
td.innerHTML = element[referenceArray[i]];
tr.appendChild(td);
}
tableBody.appendChild(tr);
});