如何在javascript中重写自定义数组中的Array.every()。reduce()?
这个问题纯粹是为了学习。youtube上说 任何高阶列表转换都可以写入 音频/视频参考: 问题: 纯粹为了学习如何使用如何在javascript中重写自定义数组中的Array.every()。reduce()?,javascript,arrays,ecmascript-6,higher-order-functions,Javascript,Arrays,Ecmascript 6,Higher Order Functions,这个问题纯粹是为了学习。youtube上说 任何高阶列表转换都可以写入 音频/视频参考: 问题: 纯粹为了学习如何使用Array.reduce()重写 这个问题源于我先前的问题 Javascript示例: var approved1 = [ { dateApproved: new Date(), id: 1, }, { dateApproved: new Date(), id: 2, } ]; v
Array.reduce()重写
这个问题源于我先前的问题
Javascript示例:
var approved1 = [
{
dateApproved: new Date(),
id: 1,
},
{
dateApproved: new Date(),
id: 2,
}
];
var approved2 = [
{
dateApproved: null,
id: 1,
},
{
dateApproved: new Date(),
id: 2,
}
];
approved1.every(a => a.dateApproved != null) ? 'APPROVED' : 'PENDING'
// 'APPROVED'
approved2.reduce(every) ? 'APPROVED' : 'PENDING'
// 'PENDING'
我很难确定当前传递的值存储在哪里。我在哪里存储“传递的”值,如Array.every()
do
function every(previousValue, currentValue, currentIdx, arr) {
if(previousValue.dateApproved !== null && currentValue.dateApproved !== null) {
return currentValue;
}
}
var approved1=[
{
批准日期:新日期(),
id:1,
},
{
批准日期:新日期(),
id:2,
}
];
var approved2=[
{
批准日期:新日期(),
id:1,
},
{
批准日期:空,
id:2,
},
{
批准日期:新日期(),
id:2,
}
];
console.log(approved2.reduce((上一个,当前)=>(上一个日期APPROVED&当前日期APPROVED)?true:false)?“APPROVED”:“REJECTED”)
console.log(approved1.reduce((prev,curr)=>(prev.dateApproved&&curr.dateApproved)?true:false)?“APPROVED”:“REJECTED”)
这应该可以实现以下功能:
function every(pre, curr) {
return pre.dateApproved != null && curr.dateApproved != null
}
approved1.reduce(every) ? 'APPROVED' : 'PENDING' // APPROVED
approved2.reduce(every) ? 'APPROVED' : 'PENDING' // PENDING
我很确定你可以不用curr
,只需pre
你可以使用reduce
而不是每一个,并让它工作,但我建议你在合适的地方使用它们。两者都有不同的要求
array.reduce
Array.reduce有4个参数
- currentElement:默认情况下,这将是第一次迭代数组中的第一个元素,然后,此变量将保存您返回的值。如果传递了一个初始值,那么它将保持该值并从那里开始
- nextElement:默认情况下,它保存第二个或下一个元素。若传递了初始值,则将保留第一个值
- 索引:保存当前元素的索引
- 数组:这是我们正在循环的父数组
- initialCurrentElement:这是一个可选参数。如果通过了,循环将从此开始
下面是一个示例,显示了一个示例:
注意:
数组。每个
将在第一个错误
条件下中断。Array.reduce将不可用
Array.reduce
用于比较同一数组中的两个值,其中asArray.each
用于将每个值与一个表达式进行比较。使用.reduce
而不是。每一个都是一种过激行为
var approved2=[{
批准日期:空,
id:1,
}, {
批准日期:新日期(),
id:2,
}];
var everyResult=approved2.每(x=>{
控制台日志(x.dateApproved)
x、 dateApproved!==null
})
console.log(everyResult)
风险减少结果=批准2.减少((p,c)=>{
控制台日志(c.dateApproved)
return!p?p:c.dateApproved!==null
},对)
log(reduceResult?'Approved':'Rejected')
您可以大致如下实现它
Array.prototype.every=函数(cb){
返回这个.reduce((p,c,i,a)=>i==1?cb(p,i-1,a)&&cb(c,i,a)
:p&cb(c,i,a));
};
var arr=[9,2,3,9,12,5],
brr=[1,2,3,4,5,6,9];
console.log(arr.every(e=>e<10));
console.log(brr.every(e=>e<10))代码>那么,你尝试了什么?@JaromandaX我将用和ping更新2分钟。我将在3:p后在我家的车里。你预计reduce的结果会是什么?传递给回调函数的第一个参数是一个累加器,该累加器将被传递给上一个调用的返回值(或者,如果没有指定,将是数组中的第一个元素)。如果reduce函数不返回任何内容(即没有return语句),那么它将是未定义的。请参阅或。@RobG我认为最终返回值将是一个true或false。如果每个测试用例都通过,则确定该值。问题是,Array.every()在哪里存储通过或失败的测试用例。此外,最后只返回一个值?这是一个很好的答案。我“认为”我终于明白了Array.reduce()的第一个参数“previousValue”是如何工作的。谢谢你简洁的回答。。减少
接受2个参数<代码>当前元素,下一个事件
。如果我颠倒approved2
的顺序,您的解决方案将失败,您的意思是颠倒顺序吗?@nikjohn您仍然返回字符串,然后比较string.dateApproved
,这将产生未定义的
@MatthewHarwood他表示如果数组中对象的顺序发生变化,即如果出现空值第一个元素而不是第二个元素,依此类推。但更新后的答案应能处理所有此类情况。正确答案更简洁!谢谢你的帮助!请浏览有关nikjohn回答的评论。这是一个不正确的解决方案是的,我完全理解它是过度杀戮减少,这个问题只是理解减少的练习better@Rajesh-OP提到他只是想学习:)@nikjohn Yes。这些都是警告。我添加了一个答案,突出了一个主要区别<代码>。每个
将在第一个错误条件下停止。减少不会。因此,您必须假定<代码> FrSigg/<代码>为布尔,而不考虑它。object@rajesh以前的值是布尔值的这种区别已经澄清了很多!泰!请注意,“currentElement”实际上是累加器,在中称为“previousValue”。您的“nextElement”称为“currentValue”。我认为最好使用规范术语来避免混淆。另外,“Array.reduce意味着比较两个值”是错误的,它意味着将一个数组减少为一个值。
function every(pre, curr) {
return pre.dateApproved != null && curr.dateApproved != null
}
approved1.reduce(every) ? 'APPROVED' : 'PENDING' // APPROVED
approved2.reduce(every) ? 'APPROVED' : 'PENDING' // PENDING
array.reduce(callback(curentElement, nextElement, index, array),[initialCurrentElement])