我想在javascript中对对象进行排序。 我有这个json:
var unsorted = {
"2014": [
{
"title": "Book",
"value": 10
},
{
"title": "Cheese",
"value": 2
}
],
"2015": [
{
"title": "Movie",
"value": 9
}
],
"2016": [
{
"title": "Slay",
"value": 90
},
{
"title": "Back",
"value": 22
}
],
"selected_year": 2015
};
所以我想根据价值对这些年内的jsons进行排序。 我试着这样做了:
var sorted = unsorted.items.sort(function(a, b) {return a.value - b.value});
alert.log(unsorted);
alert.log(sorted);
但问题是我有另一个不是json "selected_year": 2015
的字段而且它出现错误TypeError: Cannot read property 'sort' of undefined
我不知道该怎么办? 这是我的JSFIDDLE
更新: 我想在“年”里面对数组进行排序,所以我得到了这个:
var sorted = {
"2014": [
{
"title": "Cheese",
"value": 2
},
{
"title": "Book",
"value": 10
}
],
"2015": [
{
"title": "Movie",
"value": 9
}
],
"2016": [
{
"title": "Back",
"value": 22
},
{
"title": "Slay",
"value": 90
}
],
"selected_year": 2015
};
例如在排序后的“2014”里面我有:
"2014": [
{
"title": "Cheese",
"value": 2
},
{
"title": "Book",
"value": 10
}
]
答案 0 :(得分:2)
您只能对数组属性进行排序:
var unsorted = {
"2014": [
{
"title": "Book",
"value": 10
},
{
"title": "Cheese",
"value": 2
}
],
"2015": [
{
"title": "Movie",
"value": 9
}
],
"2016": [
{
"title": "Slay",
"value": 90
},
{
"title": "Back",
"value": 22
}
],
"selected_year": 2015
};
var sorted = Object.assign({}, unsorted); // Copy the unsorted object
Object.keys(sorted).forEach(key => {
if (Array.isArray(sorted[key])) {
sorted[key].sort((a, b) => a.value - b.value);
}
})
console.log(sorted);

答案 1 :(得分:2)
仅对那些数组值进行排序。您可以使用Array.isArray
检查数组。
var unsorted = { 2014: [{ title: "Book", value: 10 }, { title: "Cheese", value: 2 }], 2015: [{ title: "Movie", value: 9 }], 2016: [{ title: "Slay", value: 90 }, { title: "Back", value: 22 }], selected_year: 2015 };
Object
.keys(unsorted)
.forEach(k => {
if(Array.isArray(unsorted[k]))
unsorted[k].sort((a,b) => a.value - b.value);
});
console.log(unsorted);

.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 2 :(得分:1)
您可以检查该属性是否为数组,并根据需要对其进行排序。
var object = { 2014: [{ title: "Book", value: 10 }, { title: "Cheese", value: 2 }], 2015: [{ title: "Movie", value: 9 }], 2016: [{ title: "Slay", value: 90 }, { title: "Back", value: 22 }], selected_year: 2015 };
Object.keys(object).forEach(function (k) {
if (!Array.isArray(object[k])) {
return;
}
object[k].sort(function (a, b) {
return a.value - b.value;
});
});
console.log(object);

.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 3 :(得分:1)
array of object
object
和selected_yea
这个错误的原因
TypeError:无法读取属性' sort'未定义的
按照这样排序
var unsorted = { 2014: [{ title: "Book", value: 10 }, { title: "Cheese", value: 2 }], 2015: [{ title: "Movie", value: 9 }], 2016: [{ title: "Slay", value: 90 }, { title: "Back", value: 22 }], selected_year: 2015 };
var newArr = [];
for(let i in unsorted){
if(i !== 'selected_year'){
unsorted[i] = unsorted[i].sort(function(a, b) {
return a.value - b.value;
});
}
}
console.log(unsorted);

此解决方案比其他解决方案更快。
检查时间:https://jsfiddle.net/q976tk4r/
其他解决方案:https://jsfiddle.net/q976tk4r/1/或https://jsfiddle.net/q976tk4r/2/
答案 4 :(得分:0)
<强>问题:强>
实际上JSON对象中没有这样的属性unsorted.items
,多年来有几个密钥可以使用Object.keys(unsorted)
访问。
<强>解决方案:强>
因此,使用.map()
循环遍历这些元素,并检查该元素是array
并Array.isArray()
返回它的排序,否则只返回值:
var sorted = Object.keys(unsorted).map(function(k) {
if (Array.isArray(unsorted[k])) {
return {
[k]: unsorted[k].sort(function(a, b) {
return a.value - b.value
})
}
} else {
return {
[k]: unsorted[k]
};
}
});
<强>演示:强>
var unsorted = {
"2014": [{
"title": "Book",
"value": 10
},
{
"title": "Cheese",
"value": 2
}
],
"2015": [{
"title": "Movie",
"value": 9
}],
"2016": [{
"title": "Slay",
"value": 90
},
{
"title": "Back",
"value": 22
}
],
"selected_year": 2015
};
var sorted = Object.keys(unsorted).map(function(k) {
if (Array.isArray(unsorted[k])) {
return {
[k]: unsorted[k].sort(function(a, b) {
return a.value - b.value
})
}
} else {
return {
[k]: unsorted[k]
};
}
});
console.log(sorted);
&#13;