Я пытаюсь сортировать массив JavaScript по ссылке на другой объект.Javascript - сортировать массив по ссылке
У меня есть массив сетки. Каждая сетка содержит атрибут с именем «texture», который содержит ссылку на объект WebGLTexture. Объекты WebGLTexture не содержат никаких читаемых атрибутов, я могу сравнить их только по ссылке (==
). Метод toString не определен.
Вот пример исходной ситуации:
var texture1 = gl.createTexture(/* blah */); // Returns a WebGLTexture object
var texture2 = gl.createTexture(/* blah */); // Returns a WebGLTexture object
var texture3 = gl.createTexture(/* blah */); // Returns a WebGLTexture object
var meshes = [
{name: "Mesh 0", texture: texture1},
{name: "Mesh 1", texture: texture2},
{name: "Mesh 2", texture: texture3},
{name: "Mesh 3", texture: texture3},
{name: "Mesh 4", texture: texture2},
{name: "Mesh 5", texture: texture1},
{name: "Mesh 6", texture: texture1},
{name: "Mesh 7", texture: texture2},
{name: "Mesh 8", texture: texture3},
{name: "Mesh 9", texture: texture1}
];
То, что я хочу сделать, это для сортировки массива по ссылке текстуры, чтобы иметь что-то вроде этого (порядок не очень важно, я просто хочу объект, который имеет ту же структуру, чтобы быть последовательным):
var meshes = [
{name: "Mesh 0", texture: texture1},
{name: "Mesh 5", texture: texture1},
{name: "Mesh 6", texture: texture1},
{name: "Mesh 9", texture: texture1},
{name: "Mesh 1", texture: texture2},
{name: "Mesh 4", texture: texture2},
{name: "Mesh 7", texture: texture2},
{name: "Mesh 2", texture: texture3},
{name: "Mesh 3", texture: texture3},
{name: "Mesh 8", texture: texture3}
];
Я знаю, что это может быть возможным, чтобы достичь ее с петель, но это потребует, чтобы создавать объекты и массивы, и делать много вложенных циклов. Производительность здесь действительно важна.
Лучшее решение, которое я могу найти, - это вручную добавить к каждой текстуре уникальный атрибут «id» и использовать на нем Array.sort. Но я не очень доволен этим решением, это подразумевает изменение собственных объектов.
Знаете ли вы какой-нибудь родной и быстрый метод?
EDIT: На основании ответа воевали, вот решение:
var tempSortTextures = [];
meshes.sort(function(a, b) {
var iA = null;
var iB = null;
for(var i = 0 ; i <= tempSortTextures.length ; i++) {
if(i == tempSortTextures.length) {
if(iA == null) {
tempSortTextures.push(a.texture);
} else /*if(iB == null)*/ {
tempSortTextures.push(b.texture);
}
}
var currentTexture = tempSortTextures[i];
if(iA == null && a.texture == currentTexture) iA = i;
if(iB == null && b.texture == currentTexture) iB = i;
if(iA != null && iB != null) return iA - iB;
}
});
Почему кто-то downvoted это через два месяца после? –