javascript - 如何通过某些标准过滤对象的属性并让其余属性适应
问题描述
假设我的对象的属性是数组,我如何过滤其中一个属性并让所有其他属性适应它的长度?
示例对象:
var activities = {
start_date: [2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009],
average_speed: [10, 45, 34, 23, 65, 43, 11, 22, 55],
};
返回过滤后的对象:
function filter(activities) {
filtered = {
start_date: activities.start_date.filter(date => date > 2006),
average_speed: activities.average_speed,
};
return filtered
};
返回的filtered
对象将具有不均匀的数组长度,我只想filtered.average_speed
包含[11, 22, 55]
.
就像在 Python 中一样,我可以利用 Pandasdataframe
对象(但是我不想使用 Javascript 的数据框库,以免添加另一个依赖项):
import pandas
activities = pandas.DataFrame(some_data)
def filter(activities):
selected = activities[activities['start_date'] > 2009]
return selected
并且数据框的大小将适应start_date
数组/列的大小。
解决方案
找到 中每个匹配元素的索引start_date
,然后使用和.map
创建关联数组:start_date
average_speed
var activities = {
start_date: [2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009],
average_speed: [10, 45, 34, 23, 65, 43, 11, 22, 55],
};
function filter({ start_date, average_speed }) {
const indicies = start_date.reduce((a, date, i) => {
if (date > 2006) a.push(i);
return a;
}, []);
return {
start_date: indicies.map(i => start_date[i]),
average_speed: indicies.map(i => average_speed[i])
};
};
console.log(filter(activities));
此方法很容易扩展到除 之外的其他属性average_speed
。
如果您发现自己做这种事情不止一点,您可能会考虑将数据重新组织为对象数组,而不是包含两个单独数组的对象,例如:
var activities = [
{ start_date: 2001, average_speed: 10 },
{ start_date: 2002, average_speed: 145 },
...
然后,获取过滤后的数据很简单.filter
。
推荐阅读
- python - 如何编写 python 导入语句,以使文件在其包的内部和外部都有效?
- coq - 在 Coq 中如何组合两个假设或重新排列子目标中的括号
- javascript - Angular.js:Highchart点击事件不更新表中的数据
- express - 来自 Express 服务器端端点的套接字挂断消息
- video - 放大视频添加
- python - 由数据框构建的桑基图是空白的
- php - 在PowerShell中运行时在php中查找目录时出现错误消息
- javascript - 如何阻止页面重新加载
- google-sheets - VLOOKUP/在 Google 表格上一次转置多个 ID/搜索键
- linux - linux:端口绑定失败