繁体   English   中英

Ramda遍历数组

[英]Ramda to loop over array

循环可能是错误的术语,但它描述了我的尝试。 我想为平面数据提供结构,但是我还需要跟踪它来自的数组。

基本上我的规则是(每个数组):

  1. 如果存在1级,请给它提供项目name和一个typechild数组。 每次出现1级(即使在同一阵列中)时,也应创建一个新条目。

  2. typechild ,放置级别> 1的所有项目

  3. 如果不存在1级,请给它提供项目name和一个typechild数组。

我下面的代码几乎存在,不同之处在于它每次在看到第1级时都应创建一个数组。我的示例将有意义:

输入数据

 [
  {
    "title": "Test 1",
    "type": [{
        "name": "Animal",
        "level": 1
      },
      {
        "name": "Food",
        "level": 1
      },
      {
        "name": "Chicken",
        "level": 3
      }
    ]
  },
  {
    "title": "Test 2",
    "type": [{
      "name": "Foo",
      "level": 2
    }]
  }
]

注意:动物和食物均为1级物品。 所以它应该像这样创建两个数组...

所需的输出

[
    {
        name: "Animal",
        typechild: [
            {
                level: 2,
                name: "Chicken"
            }
        ]
    },
    {
        name: "Food",
        typechild: [
            {
                level: 2,
                name: "Chicken"
            }
        ]
    },
    {
        name: "NoName",
        typechild: [
            {
                level: 2,
                name: "Foo"
            }
        ]
    }
]

拉姆达尝试(尝试在这里: https : //dpaste.de/JQHw ):

const levelEq = (n) => pipe(prop('level'), equals(n));
const topLevel = pipe(prop('type'), find(levelEq(1)));
const topLevelName = pipe(topLevel, propOr('NoName', 'name'));
const extract2ndLevel = pipe(pluck('type'), flatten, filter(levelEq(2)));

const convert = pipe(
  groupBy(topLevelName),
  map(extract2ndLevel),
  map(uniq),
  toPairs,
  map(zipObj(['name', 'typechild']))
);

像这样吗

 var output = [{ "name": "Animal", "typechild": [{ "name": "Chicken", "level": 3 }, { "name": "Dog", "level": 2 }] }, { "name": "Food", "typechild": [{ "name": "Chicken", "level": 3 }] }, { "name": "No name", "typechild": [{ "name": "Foo", "level": 2 }, { "name": "Baz", "level": 2 }] }] let out = {}, typechild = {}, k; const data = [{ "title": "Test 1", "type": [{ "name": "Animal", "level": 1 }, { "name": "Food", "level": 1 }, { "name": "Chicken", "level": 3 }] }, { "title": "Test 2", "type": [{ "name": "Foo", "level": 2 }] }, { "title": "Test 3", "type": [{ "name": "Baz", "level": 2 }] }, { "title": "Test 4", "type": [{ "name": "Animal", "level": 1 }, { "name": "Dog", "level": 2 }] }] data.forEach((node) => { k = false; typechild[node.title] = []; node.type && node.type.forEach((t, i) => { if (t.level == 1) { k = true; !out[t.name] ? out[t.name] = { name: t.name, typechild: typechild[node.title] } : out[t.name].typechild = out[t.name].typechild.concat(typechild[node.title]); } else { typechild[node.title].push(t); } if (i == node.type.length - 1 && !k && typechild[node.title].length) { out['No name'] = out['No name'] || { name: 'No name', typechild: [] }; out['No name'].typechild = out['No name'].typechild.concat(typechild[node.title]); } }); }); console.log(JSON.stringify(Object.values(out))); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM