如何在javascript中重写自定义数组中的Array.every()。reduce()?

如何在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

这个问题纯粹是为了学习。youtube上说

任何高阶列表转换都可以写入

音频/视频参考:

问题:

纯粹为了学习如何使用
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
    用于比较同一数组中的两个值,其中as
    Array.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])