根据Javascript中的一个数组对对象中的两个数组进行排序
我有这样一个数组:根据Javascript中的一个数组对对象中的两个数组进行排序,javascript,Javascript,我有这样一个数组: var arr = [ {a: 1, b: ['apple', 'banana', 'orange', 'mango'], c: [42, 7, 18, 5]}, {a: 2, b: ['apple', 'banana', 'orange', 'mango'], c: [4, 101, 88, 3]}, {a: 3, b: ['apple', 'banana', 'orange', 'mango'], c: [14, 10, 5, 12]}, {a:
var arr = [
{a: 1, b: ['apple', 'banana', 'orange', 'mango'], c: [42, 7, 18, 5]},
{a: 2, b: ['apple', 'banana', 'orange', 'mango'], c: [4, 101, 88, 3]},
{a: 3, b: ['apple', 'banana', 'orange', 'mango'], c: [14, 10, 5, 12]},
{a: 4, b: ['apple', 'banana', 'orange', 'mango'], c: [99, 2, 105, 101]}
];
arr = [
{a: 1, b: ['mango', 'banana', 'orange', 'apple'], c: [5, 7, 18, 42]},
{a: 2, b: ['mango', 'apple', 'orange', 'banana'], c: [3, 4, 88, 101]},
{a: 3, b: ['orange', 'banana', 'mango', 'apple'], c: [5, 10, 12, 14]},
{a: 4, b: ['banana', 'apple', 'mango', 'orange'], c: [2, 99, 101, 105]}
];
我需要根据arr[x].c
值对arr[x].b
和arr[x].c
进行排序。因此,最终的数组应该如下所示:
var arr = [
{a: 1, b: ['apple', 'banana', 'orange', 'mango'], c: [42, 7, 18, 5]},
{a: 2, b: ['apple', 'banana', 'orange', 'mango'], c: [4, 101, 88, 3]},
{a: 3, b: ['apple', 'banana', 'orange', 'mango'], c: [14, 10, 5, 12]},
{a: 4, b: ['apple', 'banana', 'orange', 'mango'], c: [99, 2, 105, 101]}
];
arr = [
{a: 1, b: ['mango', 'banana', 'orange', 'apple'], c: [5, 7, 18, 42]},
{a: 2, b: ['mango', 'apple', 'orange', 'banana'], c: [3, 4, 88, 101]},
{a: 3, b: ['orange', 'banana', 'mango', 'apple'], c: [5, 10, 12, 14]},
{a: 4, b: ['banana', 'apple', 'mango', 'orange'], c: [2, 99, 101, 105]}
];
对于每个对象,构造一个
Map
,其键是水果串,值是c
数组中的关联原始编号。对c
数组进行排序,然后根据地图中项目之间的差异对b
数组进行排序:
const arr=[
{a:1,b:[‘苹果’、‘香蕉’、‘橘子’、‘芒果’],c:[42,7,18,5]},
{a:2,b:[‘苹果’、‘香蕉’、‘橘子’、‘芒果’],c:[4,101,88,3]},
{a:3,b:[‘苹果’、‘香蕉’、‘橘子’、‘芒果’],c:[14、10、5、12]},
{a:4,b:[‘苹果’、‘香蕉’、‘橘子’、‘芒果’],c:[99,2105101]}
];
Object.values(arr.forEach)({b,c})=>{
常量值=c.reduce(
(map,num,i)=>map.set(b[i],num),
新地图()
);
c、 排序((a,b)=>a-b);
b、 排序((a,b)=>fruitValues.get(a)-fruitValues.get(b));
});
控制台日志(arr)
您可以将b
和c
的元素压缩在一起,按c
元素对它们进行排序,然后将它们重新打包。使用此方法,即使要对多个列表进行排序,也只需要一个排序
const arr=[
{a:1,b:[‘苹果’、‘香蕉’、‘橘子’、‘芒果’],c:[42,7,18,5]},
{a:2,b:[‘苹果’、‘香蕉’、‘橘子’、‘芒果’],c:[4,101,88,3]},
{a:3,b:[‘苹果’、‘香蕉’、‘橘子’、‘芒果’],c:[14、10、5、12]},
{a:4,b:[‘苹果’、‘香蕉’、‘橘子’、‘芒果’],c:[99,2105101]}
];
Object.values(arr.forEach)(行=>{
让排序=row.b.map((e,i,a)=>[e,row.c[i]];
排序。排序([b1,c1],[b2,c2])=>c1-c2);
row.b=排序.map(([e,])=>e);
row.c=sorting.map(([,e])=>e);
});
控制台日志(arr)代码>您可以获取主数组的索引进行排序,根据主数组的值进行排序,并以新的顺序映射所有需要的数组
var数组=[{a:1,b:['apple','banana','orange','mango'],c:[42,7,18,5]},{a:2,b:['apple','banana','orange','mango'],c:[4,101,88,3]},{a:3,b:['apple','bananage','rango'],c:[14,10,5,12]},{a:4,b:[apple','bananager','orange orange rango','mango'],c:[99,2105,101]};
array.forEach(o=>{
var指数=[…o.c.键()]排序((a,b)=>o.c[a]-o.c[b]);
forEach(k=>o[k]=index.map(i=>o[k][i]);
});
console.log(数组)代码>
.as console wrapper{max height:100%!important;top:0;}
注意chrome对js数组的排序不会超过20行。@McBern,你有这个语句的来源吗?@NinaScholz你可以在这里阅读:sorter.js在这里我的意思是chrome不会对js数组进行正确排序>10行。
@McBern,谢谢你的链接。事实上,chrome是稳定的。你试过用谷歌chrome排序吗?js数组中的行数超过10行?我以前试过mozilla和IE,但google chrome排序不正确。我没有尝试过狩猎。