循环遍历嵌套函数中的所有文档

时间:2014-11-12 13:12:15

标签: javascript couchbase couchbase-view nosql

我开始将Couchbase用于我的新项目,我希望你能帮助我解决问题。 我的桶里有两种类型的文件。例如:

{
  "id": "A1",
  "name": "Name of A",
  "type": "A"
}

{
  "id": "B1",
  "name": "Name of B",
  "type": "B",
  "parentIDs": ["A1", "A4", "A5"]
}

我想创建一个包含以下结果的视图:

{
  "id": "A1",
  "name": "Name of A",
  "type": "A",
  "children": [
    {JSON document of child 1}, 
    {JSON document of child 2}, 
    {JSON document of child 3}
  ]
}

我开始编写一个函数和一个嵌套函数,它应该遍历所有文档,但我必须投降...你能帮助我吗?

function (doc, meta) 
{
  if(doc.type == "A")
  {
    emit(doc, GetAllSites(doc));
  }

  function GetAllSites(doc)
  {
    var sites = [];

    for(var i = 0; i < doc.length; i++)
    {
      sites.push(doc.id);
    }

    return sites;
  }
}

由于

-----------------的更新 -----------------

我用这种方式解决了我的问题:

// map function
function (doc, meta)
{
  emit(meta.id, doc);
}

// reduce function
function (key, values, rereduce) 
{
  var result = [];

  for(var i = 0; i < values.length; i++)
  {    
    var val1 = values[i];

    if(val1.type != "A")
      continue;

    val1.childrenIDs = [];

    for(var j = 0; j < values.length; j++)
    {
      var val2 = values[j];

      switch(val2.type)
      {
        case "B":
          if(contains(val2.parentIDs, val1.id))
             val1.childrenIDs.push(val2);
          break;
        default:
          break;
      }
    }
    result.push(val1);
  }

  return result;

  function contains(a, obj) {
    var i = a.length;
    while (i--) {
       if (a[i] === obj) {
           return true;
       }
    }
    return false;
  }
}

可能不是&#34;蓝图&#34;解决方案,但它的工作原理,我将在以后优化它。 : - )

1 个答案:

答案 0 :(得分:1)

您不能使用嵌套函数,在这种情况下,我建议在map函数后使用reduce函数。 所以你需要粘贴GetAllSites功能代码来减少 并且不要忘记实现rereduse逻辑