javascript - 当变量更改时如何更新异步等待函数?

标签 javascript asynchronous highcharts

genderPie()

let filter = {};


async function genderPie() {
  const d = await getData();
  const g = await d.reduce((a, o) => (o.GEN && a.push(o.GEN), a), []);
  const gender = Object.keys(g).length;
  const m = await d.reduce((a, o) => (o.GEN == 1 && a.push(o.GEN), a), []);
  const male = Object.keys(m).length;
  const f = await d.reduce((a, o) => (o.GEN == 2 && a.push(o.GEN), a), []);
  const female = Object.keys(f).length;


  var data = [{
    name: 'male',
    y: male,
    id: 1
  }, {
    name: 'female',
    y: female,
    id: 2
  }];

  chart = new Highcharts.Chart({
    plotOptions: {
      pie: {
        innerSize: '80%',
        dataLabels: {
          connectorWidth: 0
        }
      }
    },
    series: [{
      "data": data,
      type: 'pie',
      animation: false,
      point: {
        events: {
          click: function(event) {
            filter.GEN = '' + this.id + '';
          }
        }
      }
    }],
    "chart": {
      "renderTo": "gender"
    },
  });
}

async function getData() {

  buildFilter = (filter) => {
    let query = {};
    for (let keys in filter) {
      if (filter[keys].constructor === Array && filter[keys].length > 0) {
        query[keys] = filter[keys];
      }
    }
    return query;
  }

  //FILTER DATA

  //Returns the filtered data
  filterData = (dataset, query) => {
    const filteredData = dataset.filter((item) => {
      for (let key in query) {
        if (item[key] === undefined || !query[key].includes(item[key])) {
          return false;
        }
      }
      return true;
    });
    return filteredData;
  };


  //FETCH JSON
  const dataset = [{
      "GEN": "2"
    }, {
      "GEN": "1"
    }, {
      "GEN": "1"
    }, {
      "GEN": "2"
    },
    {
      "GEN": "2"
    }, {
      "GEN": "2"
    }, {
      "GEN": "2"
    }, {
      "GEN": "1"
    }
  ]

  //BUILD THE FILTER
  const query = buildFilter(filter);
  const result = filterData(dataset, query);
  console.log(result)
  return result

}
<script src="https://code.highcharts.com/highcharts.js"></script>



<div id="gender"></div>

有谁能解释一下如何处理以下问题吗?

我有两个过滤数据的函数,然后用 Hichart 构建图表 每次用户单击饼图的一个切片时,都会触发一个事件并填充一个对象。 该对象允许我过滤数据集并重新绘制图表

我缺少的最后一件事是根据要填充的对象更新过滤函数

首先我会这样做

        async function getData() {
  buildFilter = (filter) => {
    let query = {};
    for (let keys in filter) {
        if (filter[keys].constructor === Array && filter[keys].length > 0) {
            query[keys] = filter[keys];
        }
    }
    return query;
  }

然后

  filterData = (data, query) => {
    const filteredData = data.filter( (item) => {
        for (let key in query) {
            if (item[key] === undefined || !query[key].includes(item[key])) {
                return false;
            }
        }
        return true;
    });
    return filteredData;
};

const query = buildFilter(filter);
const result =  filterData(data, query);

我的对象是

let filter = {}

例如,当用户单击切片 myobject 时

let filter = {
gen: "1"
}

最佳答案

看看这个 StackBlitz project .

getData() 中,我将您的过滤器简化为:

return data.filter(item => {
    for (const property of Object.keys(filter)) {
        if (item[property] !== filter[property]) {
            return false;
        }
    }
    return true;
});

当单击切片时,我会在更新过滤器后再次调用genderPie()

您可能希望将数据请求与过滤分开,以便仅下载一次数据,而不是每次更改过滤器时下载数据。

关于javascript - 当变量更改时如何更新异步等待函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60692326/

相关文章:

java - 从 Android 中的 AsyncTask 返回一个值

javascript - 如何仅通过javascript显示带参数的iframe

javascript - 无法读取未定义的属性 'bind'。 react .js

javascript - 堆栈交换站点列表页面中的框重排算法

javascript - 使用标准 JS Promise 和 jQuery addClass 调用

c# - 为什么我的异步方法不等待 "serialPort = await SerialDevice.FromIdAsync()"?

javascript - 系列作为 Highcharts 中的列

javascript - 如何制作交互式 Highcharts 工具提示

HighCharts x 轴标签填充

javascript - 如何仅在外部 js.file 需要时加载 .js 文件