javascript - 按字母顺序对 JSON 响应对象进行排序

标签 javascript html css

只是尝试在 Javascript 中使用公共(public) API 进行一些练习。我想要做的就是,当您提交查询时,让我返回的元素列表按 h4 值(食物名称)的字母顺序排序。在调用 .map() 之前,我尝试在响应项上调用 .sort()。尝试使用 jquery 在事后直接对 div 元素进行排序,但在这两种情况下,我只得到一个空白页。我是 javascript 的新手,所有这些都是用 Notepad++ 编写的,所以可能有更好的方法来完成所有这些,但我不知道。

HTML代码:

<!DOCTYPE html>
<html>
<form action="search">
 <label>Search</label>
  <input type="text">
  <input type="submit">
  <input type="reset">
</form>

<div class="result">
 <h3>Result</h3>
</div>
</html>

CSS 代码:

.result{
 display:flex;
 flex-wrap:wrap;
}
.item{
  min-width:200px;
  margin:20px auto;
}

JavaScript 代码:

 var apiKey = "4b314d3e9171fbe99c6cdf16127ba93e";
 var apiId = "4c143c55";
 var queryItem;
 var url = 'https://trackapi.nutritionix.com/v2/search/instant?query=';

 var form = document.querySelector('form');
 var input = document.querySelector('input[type="text"]');
 var result = document.querySelector('.result');

 function search(e){
  e.preventDefault();
  queryItem = input.value;
  makeRequest(queryItem);
  input.value= "";
 }

 function reset(){
  var node = document.querySelector('.result');
  while (node.firstChild) {
  node.removeChild(node.firstChild);
 }
 }

 function createFood(name, qty, unit, photo){
 var item = document.createElement('div');
 var foodName = document.createElement('h4');
 var serving = document.createElement('p');
 var img = document.createElement('img');

 item.classList.add('item');
 foodName.innerHTML = name;
 serving.innerHTML = qty+' '+unit;
 img.src = photo;

 result.appendChild(item);
 item.appendChild(img);
 item.appendChild(foodName);
 item.appendChild(serving)

 }

 function makeRequest(queryItem) {
 reset();
 xhr = new XMLHttpRequest();

 xhr.onload = function() {
 var response = JSON.parse(this.responseText);

 response.common.map(function(food){
  createFood(food.food_name,
             food.serving_qty,
             food.serving_unit,
             food.photo.thumb
            )
  })
};

xhr.open(
 "GET",
 url+queryItem,
 true
);
xhr.setRequestHeader('x-app-id',apiId);
xhr.setRequestHeader('x-app-key',apiKey);
xhr.send();
}

form.addEventListener('submit', search)
form.addEventListener('reset', reset)

最佳答案

您可以使用通用函数按您选择的属性进行排序。

function sortByAttrAlphabeticallyASC(arr, attr) {
    return arr.sort((a, b) =>
      a[attr].toLocaleLowerCase().localeCompare(b[attr].toLocaleLowerCase())
    );
}

其中 arr 是您要排序的对象数组,attr 是将要比较的属性的名称。

如你所见here Array 有一个方法,您可以通过比较传递回调。

String 有一个比较字符串的方法,如 here女巫可以在 Array::sort 中传递以进行比较。

在你的情况下你会这样做:

sortByAttrAlphabeticallyASC(response.common, 'name').forEach(food => createFood(food.food_name,
    food.serving_qty,
    food.serving_unit,
    food.photo.thumb
))

关于javascript - 按字母顺序对 JSON 响应对象进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52542606/

相关文章:

javascript - 如何从 spring data jpa 将值打印到用户界面?

javascript - 如何使用 AngularJS 或 JavaScript 解码 URL 参数?

javascript - Facebook 点赞按钮

html - 响应式电子邮件模板不起作用

html - 如何使用 CSS 在灵活宽度设计中设置自动边距框?

html - 有没有办法在更改浏览器窗口大小时固定 Bootstrap 容器宽度?

html - 不同屏幕分辨率下嵌套div结构中div的高度

javascript - 无法使用 DOM 访问样式

html - Chrome 显示 "X"而不是右指尖括号 >

css - 如何在 Twitter Bootstrap 中制作自定义宽度的居中容器?