我正在使用 ramda map
和forEach
方法,但是当我将鼠标悬停在result
变量上时。它给出以下错误:
类型“ void []”不能分配给类型“ Foo []”。
数据类型为Foo
,并且代码正确,对此我确信。
我知道我遗漏了return
语句。我不确定要在哪里添加。
有人可以帮助我解决这个问题吗?
interface Foo {
a: number;
d: number;
c: number;
}
const col = ["a", "d", "c"];
const arr = [{ a: 1, c: 2, d: 3 }];
const ress: Foo[] = map(_item => {
const item = _item;
forEach(c => {
const val = item[c];
delete item[c];
item[c] = val;
}, col);
}, arr);
答案 0 :(得分:1)
map函数总是将一件事映射到另一件事。意味着需要一些东西并返回一些东西
但是在这里,您不返回任何将其视为无效的内容
我认为应该是这样
const col = ["a", "d", "c"];
const arr = [{ a: 1, c: 2, d: 3 }];
const ress: Foo[] = map(_item => {
const item = _item;
forEach(c => {
const val = item[c];
delete item[c];
item[c] = val;
}, col);
return item
}, arr);
};
答案 1 :(得分:1)
您可以写得更简单:
const col = ["a", "d", "c"];
const arr = [{ a: 1, c: 2, d: 3 }];
const project = (col, arr) =>
arr .map (o => col .reduce ((a, b) => ({... a, [b]: o [b]}), {}))
console .log (project (col, arr))
//~> [{a: 1, d: 3, c: 2}]
此功能在project
的Ramda中已经存在。
我们可以这样做:
const col = ["a", "d", "c"];
const arr = [{ a: 1, c: 2, d: 3 }];
console .log (project (col, arr))
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.27.0/ramda.js"></script>
<script> const {project} = R </script>
但是,如果您不使用它来创建对象属性的适当子集,我建议您实际上根本不需要此功能。它所做的就是创建对象的新版本,并按特定顺序添加属性。但是从逻辑上讲,对象应视为无序集合,因此似乎很浪费。
如果您确实将其用于属性子集,则可以使用Ramda版本。但是上面的第一个版本似乎也是一个合理的替代品。