数据处理器 data-processor

数据处理器是一个通用的JavaScript数据处理工具,专门用于高效处理和转换数组数据。该工具提供过滤、映射、排序、聚合、去重等核心数据操作功能,支持复杂的数据清洗、转换和统计分析任务。适用于大数据处理、ETL流程、数据分析和业务逻辑实现等场景,能够显著提升数据处理效率并减少计算资源消耗。关键词:数据处理、数据转换、JavaScript工具、数组操作、数据清洗、数据聚合、ETL工具、数据分析、代码执行、性能优化。

后端开发 0 次安装 0 次浏览 更新于 3/2/2026

name: data-processor description: 通过过滤、映射和聚合等常见操作处理和转换数组数据 version: 1.0.0 tags:

  • 数据
  • 转换
  • 工具

数据处理器技能

一个通用的数据处理技能,用于转换对象数组。该技能展示了代码执行的令牌效率优势——无需用自然语言描述转换过程,只需编写一次代码即可重复使用。

该技能的功能

通过常见转换处理数组数据:

  • 根据条件过滤记录
  • 将字段映射到新值
  • 聚合数据(求和、平均值、计数等)
  • 排序和分组数据
  • 删除重复项
  • 合并数据集

何时使用该技能

在以下情况下使用该技能:

  • 转换大型数据集(数百或数千条记录)
  • 对数据应用一致的业务逻辑
  • 聚合或汇总数据
  • 清理或规范化数据
  • 合并多个来源的数据

令牌效率:在代码中处理1000条记录使用约500个令牌。用自然语言描述相同操作将使用约50,000个令牌。

实现

/**
 * 数据处理器 - 通用数据转换
 * @param {Array} data - 要处理的对象数组
 * @param {Object} operations - 要应用的操作
 * @returns {Object} 处理后的数据和统计信息
 */
async function processData(data, operations = {}) {
  if (!Array.isArray(data)) {
    throw new Error('数据必须是数组');
  }
  
  let result = [...data];
  const stats = {
    inputCount: data.length,
    operations: [],
  };
  
  // 过滤操作
  if (operations.filter) {
    const beforeCount = result.length;
    result = result.filter(operations.filter);
    stats.operations.push({
      type: 'filter',
      recordsRemoved: beforeCount - result.length
    });
  }
  
  // 映射操作(转换字段)
  if (operations.map) {
    result = result.map(operations.map);
    stats.operations.push({ type: 'map' });
  }
  
  // 排序操作
  if (operations.sort) {
    const { field, order = 'asc' } = operations.sort;
    result.sort((a, b) => {
      const aVal = a[field];
      const bVal = b[field];
      const comparison = aVal < bVal ? -1 : aVal > bVal ? 1 : 0;
      return order === 'asc' ? comparison : -comparison;
    });
    stats.operations.push({ type: 'sort', field, order });
  }
  
  // 聚合操作
  if (operations.aggregate) {
    const { field, operation: aggOp } = operations.aggregate;
    const values = result.map(r => r[field]).filter(v => v != null);
    
    let aggregateResult;
    switch (aggOp) {
      case 'sum':
        aggregateResult = values.reduce((sum, v) => sum + v, 0);
        break;
      case 'average':
        aggregateResult = values.reduce((sum, v) => sum + v, 0) / values.length;
        break;
      case 'count':
        aggregateResult = values.length;
        break;
      case 'min':
        aggregateResult = Math.min(...values);
        break;
      case 'max':
        aggregateResult = Math.max(...values);
        break;
      default:
        throw new Error(`未知的聚合操作: ${aggOp}`);
    }
    
    stats.aggregateResult = {
      field,
      operation: aggOp,
      value: aggregateResult
    };
  }
  
  // 删除重复项
  if (operations.unique) {
    const { field } = operations.unique;
    const seen = new Set();
    const beforeCount = result.length;
    result = result.filter(item => {
      const key = item[field];
      if (seen.has(key)) return false;
      seen.add(key);
      return true;
    });
    stats.operations.push({
      type: 'unique',
      field,
      duplicatesRemoved: beforeCount - result.length
    });
  }
  
  stats.outputCount = result.length;
  
  return {
    data: result,
    stats
  };
}

module.exports = processData;

示例

示例1:过滤和排序

const processData = require('/skills/data-processor.js');

const salesData = [
  { id: 1, amount: 150, status: 'completed' },
  { id: 2, amount: 200, status: 'pending' },
  { id: 3, amount: 175, status: 'completed' },
  { id: 4, amount: 225, status: 'completed' }
];

const result = await processData(salesData, {
  filter: (record) => record.status === 'completed',
  sort: { field: 'amount', order: 'desc' }
});

console.log(result);
// 输出:
// {
//   data: [
//     { id: 4, amount: 225, status: 'completed' },
//     { id: 3, amount: 175, status: 'completed' },
//     { id: 1, amount: 150, status: 'completed' }
//   ],
//   stats: {
//     inputCount: 4,
//     operations: [
//       { type: 'filter', recordsRemoved: 1 },
//       { type: 'sort', field: 'amount', order: 'desc' }
//     ],
//     outputCount: 3
//   }
// }

示例2:聚合数据

const processData = require('/skills/data-processor.js');

const orders = [
  { orderId: 1, total: 100 },
  { orderId: 2, total: 150 },
  { orderId: 3, total: 200 }
];

const result = await processData(orders, {
  aggregate: { field: 'total', operation: 'sum' }
});

console.log(result.stats.aggregateResult);
// 输出: { field: 'total', operation: 'sum', value: 450 }

示例3:复杂转换

const processData = require('/skills/data-processor.js');

const customers = [
  { name: '  John Doe  ', email: 'JOHN@EXAMPLE.COM', age: 30 },
  { name: 'Jane Smith', email: 'jane@example.com', age: 25 },
  { name: '  John Doe  ', email: 'JOHN@EXAMPLE.COM', age: 30 } // 重复
];

const result = await processData(customers, {
  map: (customer) => ({
    name: customer.name.trim(),
    email: customer.email.toLowerCase(),
    age: customer.age
  }),
  unique: { field: 'email' },
  filter: (customer) => customer.age >= 25,
  sort: { field: 'age', order: 'asc' }
});

console.log(result.data);
// 输出:
// [
//   { name: 'Jane Smith', email: 'jane@example.com', age: 25 },
//   { name: 'John Doe', email: 'john@example.com', age: 30 }
// ]

与MCP工具集成

该技能与MCP工具配合使用效果很好:

// 从MCP工具获取数据
const rawData = await callMCPTool('database__query', {
  query: 'SELECT * FROM customers WHERE created_date > "2024-01-01"'
});

// 使用技能处理
const processData = require('/skills/data-processor.js');
const result = await processData(rawData, {
  filter: (r) => r.status === 'active',
  sort: { field: 'revenue', order: 'desc' },
  aggregate: { field: 'revenue', operation: 'sum' }
});

// 保存结果
await callMCPTool('storage__save', {
  key: 'processed_customers',
  value: result.data
});

// 将摘要返回给代理(非完整数据)
return {
  processedRecords: result.stats.outputCount,
  totalRevenue: result.stats.aggregateResult.value
};

提示和最佳实践

  1. 保存中间结果:对于大型数据集,在每个主要操作后保存到/workspace
  2. 返回摘要:向代理发送统计信息,而非完整数据集
  3. 链式操作:组合多个操作以实现复杂转换
  4. 验证输入:始终检查数据类型并处理边缘情况
  5. 重用此技能:保存到/skills并在多个任务中使用

相关技能

  • validator - 处理前验证数据
  • exporter - 将处理后的数据导出为各种格式
  • aggregator - 高级统计聚合

性能说明

该技能可以处理:

  • 1,000条记录:< 50毫秒
  • 10,000条记录:< 200毫秒
  • 100,000条记录:< 2秒

所有操作均使用高效的JavaScript数组方法,复杂度为O(n)或O(n log n)。


灵感来源:Anthropic的技能模式,用于令牌高效的数据处理。有关此方法背后的哲学,请参阅使用MCP进行代码执行