javascript - 在 Javascript 中合并数组中的链接数据

标签 javascript arrays ractivejs

我有一个简单的任务是重新排列 JSON 中的几个数组,因此 ractive.js 可以更好地处理它。但是有点得意忘形,结果不是特别理想。

我的初始数组示例:

[{
  "_id": 1,
  "type": "person",
  "Name": "Hans",
  "WorksFor": ["3", "4"],
}, {
  "_id": 2,
  "type": "person",
  "Name": "Michael",
  "WorksFor": ["3"],
}, {
  "_id": 3,
  "type": "department",
  "Name": "Marketing"
}, {
  "_id": 4,
  "type": "department",
  "Name": "Sales"
}, {
  "_id": 5,
  "type": "person",
  "Name": "Chris",
  "WorksFor": [],
}]

因此,对于一个给定的部门,我想要一个 ractive 方法来给我在这个部门工作的所有人员(以及他们工作的部门列表)。像这样的东西:

[{
  "_id": 1,
  "type": "person",
  "Name": "Hans",
  "WorksFor": ["3", "4"],
  "Readable": ["Marketing", "Sales"]
}, {
  "_id": 2,
  "type": "person",
  "Name": "Michael",
  "WorksFor": ["3"],
  "Readable": ["Sales"]
}]

以某种方式出现的功能与此类似:

function imsorryforthis() {
  let output = [];
  let tempdocs = this.get('docs'); //as this happens in a ractive method, 
//"this.get" is neccesary for binding 
  for (var i = 0; i < tempdocs.length; i++) {
    if (_.contains(tempdocs[i].WorksFor, givenDepartment)) { //I used underscore.js here
      let collectedDepartmentData = [];
      if (tempdocs[i].WorksFor.length > 0) {
        for (var f = 0; f < tempdocs[i].WorksFor.length; f++) {
          for (var g = 0; g < tempdocs.length; g++) {
            if (tempdocs[i].WorksFor[f] == tempdocs[g]._id) {
              let actualDepartmentData = {};
              actualDepartmentData = tempdocs[g];
              collectedDepartmentData.push(actualDepartmentData);
            }
          }
        }
      }
      tempdocs[i].Readable = collectedDepartmentData;
      output.push(tempdocs[i]);
    }
  }
  return output;
}

我把它放在 Fiddle 里了以及使其更具可读性。

由于这个怪物不知何故确实有效(我自己也很惊讶),感觉就像用右手在头上挠左耳(同时被一群绝望的数学家不断大喊大叫)。

也许任何人都知道一种更直观、更智能的方法(或者一种编译 JavaScript 的方法,这样就再也见不到曙光了)。

最佳答案

首先构造一个 map department_id => department_name:

let departments = {};

for (let x of data) {
    if (x.type === 'department') {
        departments[x._id] = x.Name;
    }
}

然后,迭代 Persons 并从该映射填充 Readable 数组:

for (let x of data) {
    if (x.type === 'person') {
        x.Readable = x.WorksFor.map(w => departments[w]);
    }
}

最后,提取特定部门的人员:

personsInSales = data.filter(x => 
    x.type === 'person' && x.WorksFor.includes('3'));

关于javascript - 在 Javascript 中合并数组中的链接数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41666909/

相关文章:

javascript - 通用 Javascript/CSS/HTML 食谱书

c - 对大型数组进行排序(快速排序)- 段错误

ruby 用不同数组的元素重命名数组的元素

javascript - Ractive 绑定(bind)到父级

javascript - 如何按对象的键对对象中的事件实例数据进行排序?

javascript - Zombie + NodeJS + Express - 使用选项卡时出错

javascript - 未捕获的类型错误 : elem. 替换不是函数

javascript - JS - 如何跨同一网络应用程序的多个实例实时更新 DOM?

javascript - 使用索引数组过滤另一个数组

c++ - 如何将 C 程序转换为类