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

标签 javascript arrays sorting opengl-es reference

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

相关文章:

python - 将字符串中的数字转换为python中的数组

jquery - 以设定的间隔循环遍历数组

javascript - 在 Javascript/Node.Js 中按二维数组中的对象属性排序

python - 拆分和编辑 CSV 列并按字母顺序排列

javascript - PHP 语句中的 CSS

c - 具有静态 const 成员的动态分配数组

javascript - Particles.js 不允许围绕文本生成

sql - 如何创建没有循环关系的树表?

javascript - 模板中的 Angular ng-href

javascript - Angular 2中的日期选择器问题