我正在尝试通过对另一个对象的引用对 JavaScript 数组进行排序。
我有一组网格。每个网格都包含一个名为“纹理”的属性,其中包含对 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。但我对这个意味着修改本机对象的解决方案并不满意。
你知道任何本地和快速的方法吗?
编辑:基于谨慎的答案,这里是解决方案:
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;
}
});