首页 > 解决方案 > 如何通过某些标准过滤对象的属性并让其余属性适应

问题描述

假设我的对象的属性是数组,我如何过滤其中一个属性并让所有其他属性适应它的长度?

示例对象:

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数组/列的大小。

标签: javascript

解决方案


找到 中每个匹配元素的索引start_date,然后使用和.map创建关联数组:start_dateaverage_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


推荐阅读