【问题标题】:Sorting a Multidimensional Array with Objects in JavaScript在 JavaScript 中使用对象对多维数组进行排序
【发布时间】:2015-07-11 06:05:37
【问题描述】:

我有一个结构如下的数组:

[[],[{"id":1,"meaning":1,"word":"b"},{"id":2,"meaning":1,"word":"a"}],[{"id":3,"meaning":2,"word":"f"},{"id":4,"meaning":2,"word":"c"}],[{"id":5,"meaning":3,"word":"d"}]]

array[0] 需要为空,因为稍后我需要该索引以用于特殊用途。 array[1] 例如包含所有带有meaning:1 的对象,array[2] 所有带有meaning:2 的对象。

我现在要做的是按 2D-Array 中的第一个对象对这个数组进行排序(也就是说按第一列)。

因此输出应该是这样的:

[[],[{"id":1,"meaning":1,"word":"b"},{"id":2,"meaning":1,"word":"a"}], [{"id":5,"meaning":3,"word":"d"}], [{"id":3,"meaning":2,"word":"f"},{"id":4,"meaning":2,"word":"c"}]]

我将不胜感激所有类型的答案。

编辑: 排序标准是字母升序

【问题讨论】:

  • 顺便说一句,我尝试使用标准的.sort() 方法,但它没有达到我的预期。我在我的应用程序中使用了 AngularJS 和 JQuery。
  • 我不确定我是否明白你在问什么。您有一组对象数组,但您的排序标准是什么?集合中具有相同含义值的最低 id?意义的最低值?顺便说一句,sort 将排序函数作为参数...
  • 我已经编辑了我的问题,排序是按字母升序排列的。

标签: javascript arrays sorting multidimensional-array


【解决方案1】:

【讨论】:

  • 是的,我确实读过。但是我不知道该怎么做才能在这个函数中只访问第一列的第一个对象(array[i][0])
【解决方案2】:

排序是一种比较,如果我理解正确,您只需要根据含义属性重新排列对象。 这应该可以为您解决问题,当然单词的排序取决于您。

function arrangeByMeaning (arr) {
    arr.forEach(function (innerArr, index) {
        innerArr.forEach(function (obj, i) {
            if (parseInt(obj.meaning) !== index) {
                var o = innerArr.pop(i);
                arr[index].push(o);
            }
        });
    });

    // sort innerArrays on word after rearranging objects
    arr.forEach(function (innerArr) {
        innerArr.sort(function (a, b) { 
            return a.word < b.word ? -1 : a.word > b.word ? 1 : 0;
        });
    });

    return arr;
};

这将修改原始数组。

Fiddle

【讨论】:

  • 感谢您的回答,但数组中对象的顺序不会改变,只会改变数组的顺序
【解决方案3】:

首先,抛弃空数组,因为它的 更容易添加它而不是在排序函数中围绕它编写代码。假设您的顶级数组称为“arr”:

//first we'll sort the sub arrays themselves
var newArr = arr.map(function(subArray) {
        subArray.sort(function(a, b) {
            if (a.word > b.word) {
                return -1;
            } else {
                return 1;
            }
        });
        return subArray;
    })

    //and now sort the containing array
    .sort(function(a, b) {
        if (a[0].word > b[0].word) {
            return -1;
        } else {
            return 1;
        }
    });

//now we'll add back in your empty array
newArr = [[]].concat(newArr);

如果子数组已经按字母顺序排列,那么您只需要全局排序。

【讨论】:

  • 我不得不交换排序函数的返回值,但是,你的答案是最简单的,并且做了我想做的事,谢谢
【解决方案4】:

给你。有点凌乱但有效:http://jsfiddle.net/8xv6s9g1/2/

var array = [[],[{"id":1,"meaning":1,"word":"b"},{"id":2,"meaning":1,"word":"a"}],[{"id":3,"meaning":2,"word":"f"},{"id":4,"meaning":2,"word":"c"}],[{"id":5,"meaning":3,"word":"d"}]];

var arrayCopy = array.slice();
for(var i = 0; i < arrayCopy.length; i++) {
    arrayCopy[i].sort(function(x, y) {
        if(!x || x.word < y.word) return 1;
        if(x.word > y.word) return -1;
        return 0;
    });
}
arrayCopy.sort(function(x, y) {
        if(!x.length && !y.length) return 0;
        if(!x.length) return -1;
        if(!y.length) return 1;

        if(x[0].word < y[0].word) return -1;
        if(x[0].word > y[0].word) return 1;
        return 0;
    });

for(var i = 0; i< arrayCopy.length; i++) {
    arrayCopy[i].index = i;
}

array.sort(function(x, y) {
        if(!x || x.index < y.index) return -1;
        if(x.index > y.index) return 1;
        return 0;
    });

console.log(array);

根据需要输出[[],[{"id":1,"meaning":1,"word":"b"},{"id":2,"meaning":1,"word":"a"}], [{"id":5,"meaning":3,"word":"d"}], [{"id":3,"meaning":2,"word":"f"},{"id":4,"meaning":2,"word":"c"}]]

【讨论】:

    猜你喜欢
    • 2017-11-09
    • 1970-01-01
    • 2011-10-23
    • 2015-01-29
    • 1970-01-01
    • 2012-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多