javascript:在一个链中,如何获得上一个数组的大小?
当链接过滤器和reduce时,如何获得过滤后的数组的大小?我需要那个尺寸来裁剪响应性强的CSS设计。 我的(简化)代码使用回调的第3和第4个参数:javascript:在一个链中,如何获得上一个数组的大小?,javascript,arrays,this,method-chaining,Javascript,Arrays,This,Method Chaining,当链接过滤器和reduce时,如何获得过滤后的数组的大小?我需要那个尺寸来裁剪响应性强的CSS设计。 我的(简化)代码使用回调的第3和第4个参数: json.articles .filter(a => keep(a,name)) .reduce((el, a,i,t) => i===0? DOMtag('section',{'class':`media${t.length}`}) .appendChild(DOMtag(`article`, content(a
json.articles
.filter(a => keep(a,name))
.reduce((el, a,i,t) =>
i===0? DOMtag('section',{'class':`media${t.length}`})
.appendChild(DOMtag(`article`, content(a,0))).parentElement
: el.appendChild(DOMtag(`article`, content(a,i))).parentElement,
null);
或者更简单一点(感谢luc和他下面的懒惰评估建议):
这两种代码都可以工作,但如果有人对如何绑定此
有想法,则可以使用累加器的初始值,例如:
json.articles
.filter(a => keep(a,name))
.reduce((el, a) =>
el.appendChild(DOMtag(`article`, content(a,i))).parentElement,
DOMtag('section',{'class':`media${this.length}`}));
有什么想法吗?在传递
reduce
的默认值时,无法访问过滤后的数组长度,因为表达式是在调用reduce
之前计算的
不过,您可以将函数的内容简化如下:
//示例数据
const json={articles:[{name:'test'},{},{name:'test2'},{},]};
//函数助手函数来说明示例
函数DOMTag(标记名,{content,className}){
常量标记=document.createElement(标记名);
如果(内容){
appendChild(document.createTextNode(content));
}
if(类名){
tag.className=className;
}
返回标签;
}
//实际应答代码的开始:
const section=json.articles
.filter(a=>a.name)
.map(a=>DOMTag(`article`,{content:a.name}))
.减少((p,c,i,a)=>
(p | | DOMTag('section',{className:`media${a.length}}})
.appendChild(c).parentElement
,空);
section.className=`media${section.childNodes.length}`
//验证
console.log(section.outerHTML)代码>reducer函数中的第四个参数是源数组@库纳尔·博赫拉。是的,这是我在第一段代码中使用它的方式,但仅在回调中可用,而在reduce中不可用(不能用于初始值)。有一种方法可以将数组传递给回调(同步回调),因此我认为应该有一种方法将此
绑定到该数组。你的变通方法2和3很有趣(1是不可链接的),但并不比我自己的第一个解决方案好多少。这是一个公平的观点。我不认为您可以按照您的思维方式使用bind
,但您可以利用布尔表达式的惰性求值来简化初始代码。用一个可能也很有趣的新选项更新答案。我不明白为什么这个答案被否决了。至少上面的评论很有用。
json.articles
.filter(a => keep(a,name))
.reduce((el, a) =>
el.appendChild(DOMtag(`article`, content(a,i))).parentElement,
DOMtag('section',{'class':`media${this.length}`}));