开发者问题收集

创建 JS 对象

2020-07-22
47

我正在使用 Wordpress REST API 从网站检索一些标签。也许我没有在 SO 上正确搜索,但我正在尝试使用我的 data 并创建我的 dataSet 变量。但我收到一条错误消息,说它无法识别 for 循环标记。我对 Javascript 还很陌生,所以我不知道如何解决这个问题。

这是我的代码:

var req = new XMLHttpRequest();
var pieChart = document.getElementById('pie_chart_1');

req.open("GET", "http://example.org/wp-json/wp/v2/tags?per_page=10")
req.onload = function() {
  if (req.status >= 200 && req.status < 400) {
      var data = JSON.parse(req.responseText);
     
    } else {
      console.log("Returning an error");
    }

};

req.onerror = function() {
   console.log("Connection error");
 };

req.send();


var dataSet = [
  for(i = 0; i < data.length; i++) {
    {legendLabel: data[i].name, magnitude:data[i].count, link: "http://example.com/tag" + data[i].slug},
  }
];

  
2个回答

您在方括号内使用 for 循环来定义数组,但语法不正确。由于您使用 WordPress REST API 获取标签,因此响应将是一个 JSON 对象,其中包含包含结果的 tags 属性 。您的 link 值中似乎也缺少 /

假设 data.tags 的值为 -

[{
  display_name: 'Test Name',
  slug: 'test-name',
}];

为此目的正确使用 for 循环 -

const dataSet = [];
const tags = data.tags;
for (let i=0; i<tags.length; i+=1) {
  dataSet.push({
     legendLabel: tags[i].display_name, 
     link: "http://example.com/tag" + tags[i].slug,
  });
}    

从原始 JSON 对象数组创建 JSON 对象数组的更好方法是使用 Array.map() 将第一个数组中的每个元素“映射”到新数组中的新元素 -

const dataSet = data.tags.map(function (element) {
  return { 
     legendLabel: element.display_name,
     link: "http://example.com/tag/" + element.slug,
  };
});

更进一步,您可以使用箭头函数、对象参数解构、显式返回,字符串模式等,以获得具有相同功能的更紧凑的语法 -

const dataSet = data.tags.map(({ display_name: displayName, slug }) => ({
  legendLabel: displayName,
  link: `http://example.com/tag/${slug}`,
});
doublesharp
2020-07-22

首先,在大多数情况下,最好使用 fetch API

在 JS 中没有 for 推导式,因此最后一块代码可以重构如下:

const dataSet = data.map(({ name, count, slug }) => ({
  legendLabel: name,
  magnitude: count,
  link: `http://example.com/tag${slug}`
}));
Alexander Alexandrov
2020-07-22