【问题标题】:Ramda to loop over arrayRamda 循环遍历数组
【发布时间】:2018-04-01 09:50:59
【问题描述】:

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

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

  1. 如果级别 1 存在 - 给它项目的 name 和一个 typechild 数组。每次出现级别 1 时(即使在同一个数组中),它都应该创建一个新条目。

  2. typechild里面,放任何等级>1的物品

  3. 如果不存在 1 级 - 将项目的 nametypechild 数组给它。

我下面的代码几乎在那里,除了它应该在每次看到级别 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"
            }
        ]
    }
]

Ramda 尝试(在这里尝试: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']))
);

【问题讨论】:

  • 为什么Chicken是2级? NoName 来自哪里?

标签: javascript arrays filter reduce ramda.js


【解决方案1】:

这样的?

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)));

【讨论】:

  • 这不太行—— typechild: 值显示一个奇怪的 ` "typechild": /**ref:3**/` 类似值。你能确认 typechild 部分是正确的吗?
  • 在您的控制台中测试。在这里它抱怨相同的参考。
  • 谢谢,但一直不确定!在这里尝试过-jsfiddle.net/7pzqb2q2
  • Man.... 你没有在我存储结果的地方登录 out var。 jsfiddle.net/7pzqb2q2/2
  • 哦,是的。我也应该说清楚 - No name 数组应该只是一个数组(组合)。那要怎么做呢?在这里取样jsfiddle.net/7pzqb2q2/4
猜你喜欢
  • 2020-01-13
  • 2014-06-04
  • 1970-01-01
  • 2019-07-10
  • 1970-01-01
  • 2013-12-16
  • 2011-01-25
相关资源
最近更新 更多