- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在做一项要求我使用 D3 的家庭作业。
我正在构建一个用户应该能够过滤的交互式表格。我有两个半工作版本。
版本一:第一次搜索时效果很好,但后续搜索会过滤掉之前的结果。 (例如,如果我先按位置过滤,然后按日期过滤,而不是得到一组全新的结果,我会得到一个使用两个过滤器的列表。如果我在第二次搜索中输入新位置,我不会得到任何结果,因为每一行只有一个位置。)
版本二:进行新搜索,但一次只应用一个过滤器(以最后一个为准)。
我的原始代码贴在下面。
我尝试使用 tbody.html("");
来重置表格;那没有用。
我尝试将筛选结果的名称切换为 tableData2。 (这确实为我的每次点击按钮提供了一个全新的开始,但剥夺了我搜索多个条件的能力。)
我之前还尝试将所有过滤器放入定义 tableData 的最后一行(此处):
tableData = tableData.filter(row => row.shape==inputShape)
但这没有用。
button.on("click", function() {
d3.event.preventDefault()
//Add date filter
let dateElement = d3.select("#datetime");
let inputDate = dateElement.property("value");
if (inputDate){
tableData = tableData.filter(row => row.datetime==inputDate)}; //add if filter to avoid nulls
// Add city filter
let cityElement = d3.select("#city");
let inputCity = cityElement.property("value");
if(inputCity){
tableData = tableData.filter(row => row.city==inputCity)};
// Add state filter
let stateElement = d3.select("#state");
let inputState = stateElement.property("value");
if (inputState) {
tableData = tableData.filter(row => row.state==inputState)};
// Add country filter
let countryElement = d3.select("#country");
let inputCountry = countryElement.property("value");
if (inputCountry){
tableData = tableData.filter(row => row.country == inputCountry)};
// Add shape filter
let shapeElement = d3.select("#shape");
let inputShape = shapeElement.property("value");
if (inputShape){
tableData = tableData.filter(row => row.shape==inputShape)};
buildTable(tableData);
});
预期的结果是,如果我对单个元素运行搜索,我将获得与该元素几乎匹配的所有结果。如果我对两个元素进行搜索,我会得到与这两个元素几乎匹配的所有结果。
我想要的结果是,我要么得到一个一次只能按一个元素过滤的表(但每次单击过滤器按钮时都会重置),要么我得到一个将应用多个过滤器的表,但是一次只有一个(并且没有被要求)。
最佳答案
您的代码不起作用的原因是您在过滤时修改了原始 tableData
,并在随后的过滤按钮点击中使用修改后的 tableData
。
您可以通过在整个函数中使用新数组 filteredTableData
来避免这样做。
var filteredTableData = tableData;
在你的函数开始时声明上面的变量,并在你函数的其余部分用 filteredTableData
替换 tableData
。
无需实现以下更改,以上修复即可。但是,如果您想一次对每个数组元素应用所有属性过滤器,或者让代码更简洁,您可以遵循以下方法。
您可以使用 Array.filter()过滤您的数据。
button.on("click", function () {
d3.event.preventDefault();
// Construct a filters object.
var filtersObj = {
"datetime": d3.select("#datetime").property("value"),
"city": d3.select("#city").property("value"),
"state": d3.select("#state").property("value"),
"country": d3.select("#country").property("value"),
"shape": d3.select("#shape").property("value")
};
// Remove properties which are undefined.
for (var key in filtersObj) {
if (!filtersObj[key]) {
delete filtersObj[key];
}
}
var filters = Object.entries(filtersObj);
// Filter on properties which are defined.
const filteredTableData = tableData.filter(item =>
filters.every(([key, value]) => item[key] == value)
);
buildTable(filteredTableData);
}
您也可以不使用 Object.entries() 进行过滤和 Array.every() .
// Filter on properties which are defined.
const filteredTableData = tableData.filter(item => {
for (var key in filtersObj) {
if (item[key] != filtersObj[key]) {
return false;
}
}
return true;
});
实例:
var tableData = [
{ "city": "Chicago", "state": "Illinois", "country": "USA" },
{ "city": "Dallas", "state": "Texas", "country": "USA" },
{ "city": "Los Angeles", "state": "California", "country": "USA" },
{ "city": "San Francisco", "state": "California", "country": "USA" }
];
function filterData(inputDate, inputCity, inputState, inputCountry, inputShape) {
// Construct a filters object.
var filtersObj = {
"datetime": inputDate,
"city": inputCity,
"state": inputState,
"country": inputCountry,
"shape": inputShape
};
// Remove properties which are undefined.
for (var key in filtersObj) {
if (!filtersObj[key]) {
delete filtersObj[key];
}
}
var filters = Object.entries(filtersObj);
// Filter on properties which are defined.
const filteredTableData = tableData.filter(item =>
filters.every(([key, value]) => item[key] == value)
);
console.log(JSON.stringify(filteredTableData));
}
filterData(null, "Chicago", null, null, null);
filterData(null, null, "California", null, null);
filterData(null, null, "Texas", "USA", null);
关于javascript - 在添加新过滤器之前重置过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57945103/
我正在尝试使用谷歌浏览器的 Trace Event Profiling Tool分析我正在运行的 Node.js 应用程序。选择点样本后,我可以在三种 View 之间进行选择: 自上而下(树) 自上而
对于一个可能是菜鸟的问题,我们深表歉意,但尽管在 SO 上研究了大量教程和其他问题,但仍找不到答案。 我想做的很简单:显示一个包含大量数据库存储字符串的 Android ListView。我所说的“很
我已经开始了一个新元素的工作,并决定给 Foundation 5 一个 bash,看看它是什么样的。在创建带有水平字段的表单时,我在文档中注意到的第一件事是它们使用大量 div 来设置样式。所以我在下
我有一个 Windows 窗体用户控件,其中包含一个使用 BeginInvoke 委托(delegate)调用从单独线程更新的第 3 方图像显示控件。 在繁重的 CPU 负载下,UI 会锁定。当我附加
我有一堆严重依赖dom元素的JS代码。我目前使用的测试解决方案依赖于 Selenium ,但 AFAIK 无法正确评估 js 错误(addScript 错误不会导致您的测试失败,而 getEval 会
我正在制作一款基于滚动 2D map /图 block 的游戏。每个图 block (存储为图 block [21][11] - 每个 map 总共 231 个图 block )最多可以包含 21 个
考虑到以下情况,我是前端初学者: 某个 HTML 页面应该包含一个沉重的图像(例如 - 动画 gif),但我不想强制客户缓慢地等待它完全下载才能享受一个漂亮的页面,而是我更愿意给他看一个轻量级图像(例
我正在设计一个小软件,其中包括: 在互联网上获取资源, 一些用户交互(资源的快速编辑), 一些处理。 我想使用许多资源(它们都列在列表中)来这样做。每个都独立于其他。由于编辑部分很累,我想让用户(可能
我想比较两个理论场景。为了问题的目的,我简化了案例。但基本上它是您典型的生产者消费者场景。 (我关注的是消费者)。 我有一个很大的Queue dataQueue我必须将其传输给多个客户端。 那么让我们
我有一个二元分类问题,标签 0 和 1(少数)存在巨大不平衡。由于测试集带有标签 1 的行太少,因此我将训练测试设置为至少 70-30 或 60-40,因此仍然有重要的观察结果。由于我没有过多地衡量准
我是一名优秀的程序员,十分优秀!