Javascript `filter` + `reduce` VS `reduce` + `if`
Javascript `filter` + `reduce` VS `reduce` + `if`
Object.entries(obj).reduce((acc, [key, value]) => {
if (someCondition(key, value)) {
acc[key] = value;
}
return acc;
}, {});
Object.entries(obj)
.filter(([key, value]) => someCondition(key, value))
.reduce((acc, [key, value]) => {
acc[key] = value;
return acc;
}, {});
以上两个块做同样的事情:创建一个 obj
的副本,并根据 someCondition
.
删除一些属性
首选哪种方式,为什么?
这总是取决于。
对于第一种情况 - reduce
里面有条件 - 你将只循环你的数据集一次。
第二种情况给了你两个循环(第二种在有限的数据集上工作)但代码更具可读性并且操作是分开的(过滤/修改数据)。
我更喜欢完全命令式的方法
function filterProperties(obj, predicate) {
const res = {};
for (const key in obj) {
const val = obj[key];
if (predicate(key, var))
res[key] = val;
}
return res;
}
或完全实用的方法
function filterProperties(obj, predicate) {
return fromEntries(Object.entries(obj).filter(entry => predicate(...entry)));
}
function fromEntries(entries) {
const res = {};
for (const [key, val] of entries) // using `reduce` is not much of an advantage here
res[key] = val;
return res;
}
Object.entries(obj).reduce((acc, [key, value]) => {
if (someCondition(key, value)) {
acc[key] = value;
}
return acc;
}, {});
Object.entries(obj)
.filter(([key, value]) => someCondition(key, value))
.reduce((acc, [key, value]) => {
acc[key] = value;
return acc;
}, {});
以上两个块做同样的事情:创建一个 obj
的副本,并根据 someCondition
.
首选哪种方式,为什么?
这总是取决于。
对于第一种情况 - reduce
里面有条件 - 你将只循环你的数据集一次。
第二种情况给了你两个循环(第二种在有限的数据集上工作)但代码更具可读性并且操作是分开的(过滤/修改数据)。
我更喜欢完全命令式的方法
function filterProperties(obj, predicate) {
const res = {};
for (const key in obj) {
const val = obj[key];
if (predicate(key, var))
res[key] = val;
}
return res;
}
或完全实用的方法
function filterProperties(obj, predicate) {
return fromEntries(Object.entries(obj).filter(entry => predicate(...entry)));
}
function fromEntries(entries) {
const res = {};
for (const [key, val] of entries) // using `reduce` is not much of an advantage here
res[key] = val;
return res;
}