我正在尝试通过对另一个对象的引用对 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。但我对这个解决方案并不满意,它意味着修改 native 对象。
你知道什么原生且快速的方法吗?
编辑:根据 wared 的答案,这是解决方案:
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;
}
});
最佳答案
可能不是最好的解决方案,但它可以工作(使用纯 JavaScript):)
var map = [texture1, texture2, texture3];
meshes.sort(function (a, b) {
var i = 0, item;
while (item = map[i]) {
if (a.texture && item === a.texture) { a = i; }
if (b.texture && item === b.texture) { b = i; }
if (!a.texture && !b.texture) { return a - b; }
i++;
}
});
关于Javascript - 通过引用对数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19135485/