在数组中按数组排序对象?
Sort object by array within array?
我有一个如下所示的本地存储:
Key: Savedme
Value:
{
"Bob":["1","1"],
"John":["2","1"],
"Mom":["3","1"],
"Dad":["1","2"],
"Tom":["3","2"],
"Skipper42":["2","3"],
"Hated_41":["3","3"],
"Greeneggs":["2","2"],
"William":["1","3"]
}
我需要以某种方式对其进行排序,使其看起来像这样
{
"Bob":["1","1"],
"Dad":["1","2"],
"William":["1","3"]
"John":["2","1"],
"Greeneggs":["2","2"],
"Skipper42":["2","3"],
"Mom":["3","1"],
"Tom":["3","2"],
"Hated_41":["3","3"]
}
我试过将它存储在这样的矩阵中:
var $runthrough = [[]];
$runthrough[$x,$y] = $values;
其中 x 是第一组数字,y 是下一组,然后 values 是 Bob、Dad 等...从那里我可以为矩阵的两个部分做一个 foreach 并且它会完成,但是当我在运行一组对象后使用此方法时,第二组给出了一个 "undefined",即使我已经设置了一些触发器来检查并且它实际上并没有未定义。
var loadarray = JSON.parse(localStorage.getItem( 'savedme' ));
$.each(loadarray, function(k, v) {
if(typeof k === 'undefined' || !k){
console.error("undefined found at k!");
};
if(typeof v[0] === 'undefined' || !v[0]){
console.error("undefined found at x!");
};
if(typeof v[1] === 'undefined' || !v[1]){
console.error("undefined found at y!");
};
});
所以我开始意识到,我可能对数组做错了,所以我认为整理数组然后使用相同的函数会更快。它必须这样排序,因为它基本上要输出到矩阵 table,我试过这样排序:
{
"1":["1","Bob"],
"2":["1","John"],
}
但是...索引值 1 会被最后一个值覆盖
对象属性在 JavaScript 中没有保证顺序,您需要使用 Array
。
对象的定义来自 ECMAScript Third Edition (pdf):
4.3.3 Object
An object is a member of the
type Object. It is an unordered collection of properties each of which
contains a primitive value, object, or
function. A function stored in a
property of an object is called a
method.
试试这样的数据结构:
[
{ name: "Bob", value: ["1","1"] },
{ name: "Dad", value: ["1","2"] },
{ name: "William", value: ["1","3"] },
{ name: "John", value: ["2","1"] },
{ name: "Greeneggs", value: ["2","2"] },
{ name: "Skipper42", value: ["2","3"] },
{ name: "Mom", value: ["3","1"] },
{ name: "Tom", value: ["3","2"] },
{ name: "Hated_41", value: ["3","3"] }
]
你可以像这样生成这个结构:
var loadarray = JSON.parse(localStorage.getItem( 'savedme' ));
var sorted = [];
for (var prop in loadarray) {
if (loadarray.hasOwnProperty(prop)) {
sorted.push({name:prop, value:loadarray[prop]});
}
}
sorted.sort(function(a, b) {
var v0 = a.value[0] - b.value[0];
return v0 == 0 ? a.value[0] - a.value[0] : v0;
});
键无法在对象中排序。
但是,可以使用 Object.keys(object).sort()
.
按顺序 处理
在这里,我将对象输出到一个数组——按键值排序——然后显示该数组:
var obj= {
"Bob":["1","1"],
"John":["2","1"],
"Mom":["3","1"],
"Dad":["1","2"],
"Tom":["3","2"],
"Skipper42":["2","3"],
"Hated_41":["3","3"],
"Greeneggs":["2","2"],
"William":["1","3"]
}
var arr= Object.keys(obj)
.sort(function(a, b) {
if(obj[a][0]===obj[b][0]) {
return obj[a][1] - obj[b][1];
}
else {
return obj[a][0] - obj[b][0];
}
})
.map(function(key) {
var o= {};
o[key]= obj[key];
return o;
});
document.body.innerHTML= JSON.stringify(arr);
您可以使用相同的索引链接值的增量。
var a = [
{ "Bob": ["1", "1"] },
{ "John": ["2", "1"] },
{ "Mom": ["3", "1"] },
{ "Dad": ["1", "2"] },
{ "Tom": ["3", "2"] },
{ "Skipper42": ["2", "3"] },
{ "Hated_41": ["3", "3"] },
{ "Greeneggs": ["2", "2"] },
{ "William": ["1", "3"] }
];
a.sort(function (a, b) {
var aa = a[Object.keys(a)],
bb = b[Object.keys(b)];
if (aa[0] === bb[0]) {
return aa[1] - bb[1];
} else {
return aa[0] - bb[0];
}
});
document.querySelector("#demo").innerHTML = JSON.stringify(a, null, 4);
<div id="demo"></div>
2021 年更新
const
array = [{ Bob: ["1", "1"] }, { John: ["2", "1"] }, { Mom: ["3", "1"] }, { Dad: ["1", "2"] }, { Tom: ["3", "2"] }, { Skipper42: ["2", "3"] }, { Hated_41: ["3", "3"] }, { Greeneggs: ["2", "2"] }, { William: ["1", "3"] }];
array.sort((a, b) => {
const
aa = Object.values(a)[0],
bb = Object.values(b)[0];
return aa[0] - bb[0] || aa[1] - bb[1];
});
console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }
很晚了,但是你可以试试这个,假设你有一个数组:
var data=[{Value:
{
"Bob":["1","1"],
"John":["2","1"],
"Mom":["3","1"],
"Dad":["1","2"],
"Tom":["3","2"],
"Skipper42":["2","3"],
"Hated_41":["3","3"],
"Greeneggs":["2","2"],
"William":["1","3"]
}}];
data.forEach((elem)=>{
for(const property in elem.Value){
var k = elem.Value[property];
k.sort((a,b)=>a-b);
}
});
console.log(data);
我有一个如下所示的本地存储:
Key: Savedme
Value:
{
"Bob":["1","1"],
"John":["2","1"],
"Mom":["3","1"],
"Dad":["1","2"],
"Tom":["3","2"],
"Skipper42":["2","3"],
"Hated_41":["3","3"],
"Greeneggs":["2","2"],
"William":["1","3"]
}
我需要以某种方式对其进行排序,使其看起来像这样
{
"Bob":["1","1"],
"Dad":["1","2"],
"William":["1","3"]
"John":["2","1"],
"Greeneggs":["2","2"],
"Skipper42":["2","3"],
"Mom":["3","1"],
"Tom":["3","2"],
"Hated_41":["3","3"]
}
我试过将它存储在这样的矩阵中:
var $runthrough = [[]];
$runthrough[$x,$y] = $values;
其中 x 是第一组数字,y 是下一组,然后 values 是 Bob、Dad 等...从那里我可以为矩阵的两个部分做一个 foreach 并且它会完成,但是当我在运行一组对象后使用此方法时,第二组给出了一个 "undefined",即使我已经设置了一些触发器来检查并且它实际上并没有未定义。
var loadarray = JSON.parse(localStorage.getItem( 'savedme' ));
$.each(loadarray, function(k, v) {
if(typeof k === 'undefined' || !k){
console.error("undefined found at k!");
};
if(typeof v[0] === 'undefined' || !v[0]){
console.error("undefined found at x!");
};
if(typeof v[1] === 'undefined' || !v[1]){
console.error("undefined found at y!");
};
});
所以我开始意识到,我可能对数组做错了,所以我认为整理数组然后使用相同的函数会更快。它必须这样排序,因为它基本上要输出到矩阵 table,我试过这样排序:
{
"1":["1","Bob"],
"2":["1","John"],
}
但是...索引值 1 会被最后一个值覆盖
对象属性在 JavaScript 中没有保证顺序,您需要使用 Array
。
对象的定义来自 ECMAScript Third Edition (pdf):
4.3.3 Object
An object is a member of the type Object. It is an unordered collection of properties each of which contains a primitive value, object, or function. A function stored in a property of an object is called a method.
试试这样的数据结构:
[
{ name: "Bob", value: ["1","1"] },
{ name: "Dad", value: ["1","2"] },
{ name: "William", value: ["1","3"] },
{ name: "John", value: ["2","1"] },
{ name: "Greeneggs", value: ["2","2"] },
{ name: "Skipper42", value: ["2","3"] },
{ name: "Mom", value: ["3","1"] },
{ name: "Tom", value: ["3","2"] },
{ name: "Hated_41", value: ["3","3"] }
]
你可以像这样生成这个结构:
var loadarray = JSON.parse(localStorage.getItem( 'savedme' ));
var sorted = [];
for (var prop in loadarray) {
if (loadarray.hasOwnProperty(prop)) {
sorted.push({name:prop, value:loadarray[prop]});
}
}
sorted.sort(function(a, b) {
var v0 = a.value[0] - b.value[0];
return v0 == 0 ? a.value[0] - a.value[0] : v0;
});
键无法在对象中排序。
但是,可以使用 Object.keys(object).sort()
.
在这里,我将对象输出到一个数组——按键值排序——然后显示该数组:
var obj= {
"Bob":["1","1"],
"John":["2","1"],
"Mom":["3","1"],
"Dad":["1","2"],
"Tom":["3","2"],
"Skipper42":["2","3"],
"Hated_41":["3","3"],
"Greeneggs":["2","2"],
"William":["1","3"]
}
var arr= Object.keys(obj)
.sort(function(a, b) {
if(obj[a][0]===obj[b][0]) {
return obj[a][1] - obj[b][1];
}
else {
return obj[a][0] - obj[b][0];
}
})
.map(function(key) {
var o= {};
o[key]= obj[key];
return o;
});
document.body.innerHTML= JSON.stringify(arr);
您可以使用相同的索引链接值的增量。
var a = [
{ "Bob": ["1", "1"] },
{ "John": ["2", "1"] },
{ "Mom": ["3", "1"] },
{ "Dad": ["1", "2"] },
{ "Tom": ["3", "2"] },
{ "Skipper42": ["2", "3"] },
{ "Hated_41": ["3", "3"] },
{ "Greeneggs": ["2", "2"] },
{ "William": ["1", "3"] }
];
a.sort(function (a, b) {
var aa = a[Object.keys(a)],
bb = b[Object.keys(b)];
if (aa[0] === bb[0]) {
return aa[1] - bb[1];
} else {
return aa[0] - bb[0];
}
});
document.querySelector("#demo").innerHTML = JSON.stringify(a, null, 4);
<div id="demo"></div>
2021 年更新
const
array = [{ Bob: ["1", "1"] }, { John: ["2", "1"] }, { Mom: ["3", "1"] }, { Dad: ["1", "2"] }, { Tom: ["3", "2"] }, { Skipper42: ["2", "3"] }, { Hated_41: ["3", "3"] }, { Greeneggs: ["2", "2"] }, { William: ["1", "3"] }];
array.sort((a, b) => {
const
aa = Object.values(a)[0],
bb = Object.values(b)[0];
return aa[0] - bb[0] || aa[1] - bb[1];
});
console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }
很晚了,但是你可以试试这个,假设你有一个数组:
var data=[{Value:
{
"Bob":["1","1"],
"John":["2","1"],
"Mom":["3","1"],
"Dad":["1","2"],
"Tom":["3","2"],
"Skipper42":["2","3"],
"Hated_41":["3","3"],
"Greeneggs":["2","2"],
"William":["1","3"]
}}];
data.forEach((elem)=>{
for(const property in elem.Value){
var k = elem.Value[property];
k.sort((a,b)=>a-b);
}
});
console.log(data);