如何遍历 PersistentVector

How to iterate over PersistentVector

我正在使用 near-sdk-as 并且我有这份工作列表:

private jobs: PersistentVector<Job>;

如何遍历作业以便我可以:

  1. return 以用户友好的格式(即 JSON 或字符串列表)
  2. 在里面搜索一个元素

NEAR 文档中的此页面解释了所有集合的工作原理及其功能

https://docs.near.org/docs/concepts/data-storage

有了PersistentVector你就可以

  • 使用length作为循环的边界
  • 使用pop (or its alias popBack) 增量移动

一般来说,所有这些集合都只是键值存储的包装器,这意味着您可以编写自己的。

如果您能想象一个缺失的数据结构,我们几乎肯定很乐意资助您构建一个。查看 https://near.university/teach 通过赠款、奖学金等做出贡献的机会

只是为了补充@amgando 的回答,这里有一个关于如何做到这一点的例子。示例中有一些重点,我也会写在评论中

  • 将@nearBindgen 注释添加到您的 class (Job)
  • 初始化 PersistentVector
  • 时添加一个唯一前缀(为您的合约)
import { PersistentVector } from 'near-sdk-core';

@nearBindgen // need annotation to serialize the object
class Job {
  title: string;
  constructor(title: string) {
    this.title = title;
  }
}


export class Contract {
  private jobs: PersistentVector<Job> = new PersistentVector<Job>('jobs'); // Need a unique prefix

  addJob(title: string): Job {
    const job = new Job(title);
    this.jobs.push(job);
    return job;
  }

  getJobs(): Job[] {
    const res: Job[] = [];
    for (let i = 0; i < this.jobs.length; i++) {
      res.push(this.jobs[i]);
    }
    return res;
  }
}

使用上面的代码,当您调用 getJobs() 函数时,您不会修改状态(就像 pop() 函数那样)。

关于你的第二个问题

为了搜索工作,您需要循环向量,并检查是否有任何工作符合工作条件。我不确定在客户端进行这种过滤是否更好(就汽油费而言)。