使用JavaScript中的对象对多维数组进行排序
我有一个具有以下结构的数组:使用JavaScript中的对象对多维数组进行排序,javascript,arrays,sorting,multidimensional-array,Javascript,Arrays,Sorting,Multidimensional 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"}]] array[0]需要为空,因为我需要该索引以备以后特殊使用。 数组[1]例如,包含所有具有含义:1,数组[2]所有具有含义:2
[[],[{"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]
需要为空,因为我需要该索引以备以后特殊使用。
数组[1]
例如,包含所有具有含义:1
,数组[2]
所有具有含义:2
的对象
我现在要做的是按照2D数组中的第一个对象对数组进行排序(也就是说按照第一列)
因此,输出应如下所示:
[[],[{"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"}]]
我将感谢所有类型的答案
编辑:
排序标准是按字母升序排列的您知道排序可以将函数作为参数吗?
排序是一种比较,如果我理解正确,您只需要根据语义属性重新排列对象。 这应该对你有帮助,当然单词的排序取决于你
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;
};
函数arrangebymeans(arr){
arr.forEach(函数(innerArr,索引){
innerArr.forEach(函数(obj,i){
if(parseInt(对象含义)!==索引){
var o=内部阵列pop(i);
arr[index].push(o);
}
});
});
//重新排列对象后对word上的InnerArray排序
arr.forEach(函数(innerArr){
内部数组排序(函数(a,b){
返回a.wordb.word-1:0;
});
});
返回arr;
};
这将修改原始数组
首先,丢弃空数组,因为添加空数组比在排序函数中围绕空数组编码要容易得多。假设顶级数组名为“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);
如果子数组已经按alphebetic顺序排列,则只需要全局排序 给你。有点不整洁,但可以工作:
var数组=[[],[{“id”:1,“意思”:1,“单词”:“b”},{“id”:2,“意思”:1,“单词”:“a”},{“id”:3,“意思”:2,“单词”:“f”},{“id”:4,“意思”:2,“单词”:“c”},{“id”:5,“意思”:3,“单词”:“d”}];
var arrayCopy=array.slice();
对于(var i=0;iy.word)返回-1;
返回0;
});
}
排序(函数(x,y){
如果(!x.length&&!y.length)返回0;
如果(!x.length)返回-1;
如果(!y.length)返回1;
if(x[0].wordy[0].word)返回1;
返回0;
});
对于(var i=0;iy.index)返回1;
返回0;
});
console.log(数组);
输出是
[[],[{“id”:1,“意”:1,“词”:“b”},{“id”:2,“意”:1,“词”:“a”},{“id”:5,“意”:3,“词”:“d”},{“id”:3,“意”:2,“词”:“f”},{“id”:4,“意”:2,“词”:“c”}]
根据需要顺便说一句,我尝试使用标准的.sort()
方法,但没有达到我的预期效果。我在应用程序中使用AngularJS和JQuery。我不确定我是否理解您的要求。您有一个对象数组,但您的排序标准是什么?集合中具有相同意义值的最低id?意义的最低价值?顺便说一句,排序以排序函数作为参数…我已经编辑了我的问题,排序循环是按字母升序排列的。是的,我确实读过。但是我不知道该怎么做才能在这个函数中只访问第一列的第一个对象(数组[I][0])谢谢你的回答,但是数组中对象的顺序不能改变,只有数组的顺序我必须交换排序函数的返回值,但是你的回答是最简单的,并且做了我想做的,非常感谢。
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);