Javascript 从对象数组中获取匹配属性,并将它们放入新数组中
我有一个具有以下结构的对象数组:Javascript 从对象数组中获取匹配属性,并将它们放入新数组中,javascript,arrays,ecmascript-6,Javascript,Arrays,Ecmascript 6,我有一个具有以下结构的对象数组: let arr = [ {name: "abc", show: true , display:"ABC"}, {name: "xyz", show: false , display:"XYZ"}, {name: "pqr", show: true , display:"PQR"}, {name: "lmn", show: false , display:"LMN"} ] 我希望输出为两个数组,一个用于show:true,另一个用于show:fa
let arr = [
{name: "abc", show: true , display:"ABC"},
{name: "xyz", show: false , display:"XYZ"},
{name: "pqr", show: true , display:"PQR"},
{name: "lmn", show: false , display:"LMN"}
]
我希望输出为两个数组,一个用于show:true
,另一个用于show:false
,即基于show
属性的值。理想情况下,使用一个函数同时提供两个数组将非常好。我期待下一个输出:
arr1 = ["abc", "pqr"]
arr2 = ["xyz", "lmn"]
我目前的做法是:
// Approach I have tried so far:
var results = arr.filter(function(entry) {
return entry.show === false;
});
但是这给了我一个对象数组,我想要一个名为的数组。有人能帮我吗?试试这个:
让arr=[{name:“abc”,show:true,display:“abc”},
{name:“xyz”,show:false,display:“xyz”},
{name:“pqr”,show:true,display:“pqr”},
{name:“lmn”,show:false,display:“lmn”}
]
常量匹配=(bool)=>arr.filter(res=>res.show==bool.map(ele=>ele.name);
console.log(匹配(true));
console.log(匹配(false))代码>ForEach
每个对象,然后检查show属性。如果show==true
则将内容推送到一个数组,否则推送到另一个数组
让arr=[{name:“abc”,show:true,display:“abc”},{name:“xyz”,show:false,display:“xyz”},{name:“pqr”,show:true,display:“pqr”},{name:“lmn”,show:false,display:“lmn”}]
设arr1=[],arr2=[];
arr.forEach((val,intt)=>{
如果(val.show){
arr1.推送(val.name)
}否则{
arr2.推送(val.name)
}
})
控制台日志(arr1);
控制台日志(arr2)
您可以使用.reduce
构建多维数组,然后将名称
按入索引0
如果show为false
,则按入索引1
如果show为true
,如下所示:
让arr=[
{name:“abc”,show:true,display:“abc”},
{name:“xyz”,show:false,display:“xyz”},
{name:“pqr”,show:true,display:“pqr”},
{name:“lmn”,show:false,display:“lmn”}
];
让[arr2,arr1]=arr.reduce(
(acc,{name,show})=>(acc[+show].push(name,acc),
[[], []]);
console.log(arr1);//[“abc”、“pqr”]
console.log(arr2);//[“xyz”、“lmn”]
一种可能的解决方案是使用所需的数组生成对象,然后您可以稍后访问这些数组
让arr=[
{name:“abc”,show:true,display:“abc”},
{name:“xyz”,show:false,display:“xyz”},
{name:“pqr”,show:true,display:“pqr”},
{name:“lmn”,show:false,display:“lmn”}
];
var res=arr.reduce((acc,{show,name})=>
{
如果(显示)
acc.show.push(名称);
其他的
acc.noShow.push(名称);
返回acc;
},{show:[],noShow:[]});
log(“show=>true”,res.show);
log(“show=>false”,res.noShow)代码>
.as控制台{背景色:黑色!重要;颜色:石灰;}
.as控制台包装器{max height:100%!important;top:0;}
使用Ramda.js这样的库可以使解决方案简洁美观
const arr=[
{name:“abc”,show:true,display:“abc”},
{name:“xyz”,show:false,display:“xyz”},
{name:“pqr”,show:true,display:“pqr”},
{name:“lmn”,show:false,display:“lmn”}
]
常数f=R.管道(
右分区(右道具(“显示”),
R.map(R.Pull(“名称”))
)
console.log(f(arr))
非常好(和智能)的解决方案!