gpt4 book ai didi

Javascript - 通过引用对数组进行排序

转载 作者:行者123 更新时间:2023-11-28 20:16:22 24 4
gpt4 key购买 nike

我正在尝试通过对另一个对象的引用对 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com