实现 data.sort 以按标题对 json 进行排序,不断收到"undefined"错误。不知道我做错了什么



我正在尝试按标题对一些JSON数据进行排序。

以下是JSON数据:

[
{
"products": null
},
{
"products": {
"1": {
"id": "dLJgXNo",
"title": "BBBBB",
"image": {
"url": "https://www.adweek.com/wp-content/uploads/2017/11/google-G-logo-hed-2017.jpg",
"path": "product_images/ATAzyRGXvIn8I4vTP275Xr3hHowmxhdNMdMDg3Dz.jpeg"
},
"quantity": {
"min": 1,
"max": 1
},
"price": 1,
"currency": "USD",
"stock_warning": 0,
"type": "account",
"stock": 13
},
"2": {
"id": "kVq0nNc",
"title": "LLLLL",
"image": {
"url": "https://www.adweek.com/wp-content/uploads/2017/11/google-G-logo-hed-2017.jpg",
"path": "product_images/C8FFOV9u14AbEALsc6j8YOx68n2ddIxgCBI8T00b.gif"
},
"quantity": {
"min": 1,
"max": 1
},
"price": 99.99,
"currency": "USD",
"stock_warning": 0,
"type": "service",
"stock": 9223372036854776000
},
"3": {
"id": "VVPanJG",
"title": "QQQQQ",
"image": {
"url": "https://www.adweek.com/wp-content/uploads/2017/11/google-G-logo-hed-2017.jpg",
"path": "product_images/ag7cdutbMnSiFknvXi3lKuCHNgCjyo5MEdEic9rS.png"
},
"quantity": {
"min": 1,
"max": 1
},
"price": 999.99,
"currency": "USD",
"stock_warning": 0,
"type": "service",
"stock": 9223372036854776000
},
"4": {
"id": "RE3EcTr",
"title": "AAAAA",
"image": {
"url": "https://www.adweek.com/wp-content/uploads/2017/11/google-G-logo-hed-2017.jpg",
"path": "product_images/Wtu1jGF2FWnxRR00yfvKaKF5Z8jnHrWhVwWUhJzF.png"
},
"quantity": {
"min": 1,
"max": 100
},
"price": 0.5,
"currency": "USD",
"stock_warning": 0,
"type": "account",
"stock": 87
},
"5": {
"id": "oeB4ekE",
"title": "NNNNN",
"image": {
"url": "https://www.adweek.com/wp-content/uploads/2017/11/google-G-logo-hed-2017.jpg",
"path": "product_images/2X0adruZr4ObIgLujM8LbLzOYiEZxYBuif6K8NnR.jpeg"
},
"quantity": {
"min": 1,
"max": 1
},
"price": 3,
"currency": "USD",
"stock_warning": 0,
"type": "account",
"stock": 14
},
"6": {
"id": "17SHtAg",
"title": "MMMMMM",
"image": null,
"quantity": {
"min": 1,
"max": 1000000
},
"price": 1,
"currency": "USD",
"stock_warning": 1,
"type": "account",
"stock": 5
},
"7": {
"id": "815DuOe",
"title": "PPPPP",
"image": null,
"quantity": {
"min": 1,
"max": 1
},
"price": 3,
"currency": "USD",
"stock_warning": 0,
"type": "account",
"stock": 15
},
"8": {
"id": "9kRifdb",
"title": "TTTTT",
"image": null,
"quantity": {
"min": 1,
"max": 1
},
"price": 3,
"currency": "USD",
"stock_warning": 0,
"type": "account",
"stock": 13
},
"9": {
"id": "BoVtpDQ",
"title": "ZZZZZ",
"image": null,
"quantity": {
"min": 1,
"max": 1000000
},
"price": 3,
"currency": "USD",
"stock_warning": 0,
"type": "account",
"stock": 1206
},
"10": {
"id": "Mb0tcZ6",
"title": "GGGGG",
"image": null,
"quantity": {
"min": 1,
"max": 1000
},
"price": 2,
"currency": "USD",
"stock_warning": 0,
"type": "account",
"stock": 998
}
}
}
]

我正在尝试使用非常方便的data.sort函数。但只收到未定义错误的"localeCompare"。这是我的代码:

var data = [{"products":null},{"products":{"1":{"id":"dLJgXNo","title":"BBBBB","image":{"url":"https://www.adweek.com/wp-content/uploads/2017/11/google-G-logo-hed-2017.jpg","path":"product_images/ATAzyRGXvIn8I4vTP275Xr3hHowmxhdNMdMDg3Dz.jpeg"},"quantity":{"min":1,"max":1},"price":1,"currency":"USD","stock_warning":0,"type":"account","stock":13},"2":{"id":"kVq0nNc","title":"LLLLL","image":{"url":"https://www.adweek.com/wp-content/uploads/2017/11/google-G-logo-hed-2017.jpg","path":"product_images/C8FFOV9u14AbEALsc6j8YOx68n2ddIxgCBI8T00b.gif"},"quantity":{"min":1,"max":1},"price":99.99,"currency":"USD","stock_warning":0,"type":"service","stock":9223372036854776000},"3":{"id":"VVPanJG","title":"QQQQQ","image":{"url":"https://www.adweek.com/wp-content/uploads/2017/11/google-G-logo-hed-2017.jpg","path":"product_images/ag7cdutbMnSiFknvXi3lKuCHNgCjyo5MEdEic9rS.png"},"quantity":{"min":1,"max":1},"price":999.99,"currency":"USD","stock_warning":0,"type":"service","stock":9223372036854776000},"4":{"id":"RE3EcTr","title":"AAAAA","image":{"url":"https://www.adweek.com/wp-content/uploads/2017/11/google-G-logo-hed-2017.jpg","path":"product_images/Wtu1jGF2FWnxRR00yfvKaKF5Z8jnHrWhVwWUhJzF.png"},"quantity":{"min":1,"max":100},"price":0.5,"currency":"USD","stock_warning":0,"type":"account","stock":87},"5":{"id":"oeB4ekE","title":"NNNNN","image":{"url":"https://www.adweek.com/wp-content/uploads/2017/11/google-G-logo-hed-2017.jpg","path":"product_images/2X0adruZr4ObIgLujM8LbLzOYiEZxYBuif6K8NnR.jpeg"},"quantity":{"min":1,"max":1},"price":3,"currency":"USD","stock_warning":0,"type":"account","stock":14},"6":{"id":"17SHtAg","title":"MMMMMM","image":null,"quantity":{"min":1,"max":1000000},"price":1,"currency":"USD","stock_warning":1,"type":"account","stock":5},"7":{"id":"815DuOe","title":"PPPPP","image":null,"quantity":{"min":1,"max":1},"price":3,"currency":"USD","stock_warning":0,"type":"account","stock":15},"8":{"id":"9kRifdb","title":"TTTTT","image":null,"quantity":{"min":1,"max":1},"price":3,"currency":"USD","stock_warning":0,"type":"account","stock":13},"9":{"id":"BoVtpDQ","title":"ZZZZZ","image":null,"quantity":{"min":1,"max":1000000},"price":3,"currency":"USD","stock_warning":0,"type":"account","stock":1206},"10":{"id":"Mb0tcZ6","title":"GGGGG","image":null,"quantity":{"min":1,"max":1000},"price":2,"currency":"USD","stock_warning":0,"type":"account","stock":998}}}];
data.sort(function (a, b) {
return a.products.title.localeCompare(b.products.title);
});
document.write('<pre>' + JSON.stringify(data, 0, 4) + '</pre>');
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

我肯定在这里错过了什么,我是不是在某个地方错过了一个循环?也许我没有正确导航JSON。任何有帮助的事情,我们都非常感激。感谢

您的代码a.products.title.localeCompare(b.products.title);不适用于您的数据结构。请注意,products是一个具有键/值对的对象。这些值具有title属性,但products对象没有,因此a.products.titleb.products.title都是undefined,尝试执行undefined.localeCompare将失败。

在我看来,您实际上是想先从products对象中提取产品,然后对它们进行排序。试试这个:

const sortedData = data
.reduce((products, obj) => products.concat(Object.values(obj.products || {})), [])
.sort((a, b) => a.title.localeCompare(b.title));

最新更新