问题描述
"datawithisNew": [
{
"exam_name": "MPSC","isNew": false
},{
"exam_name": "MPSC","isNew": true
},{
"exam_name": "UPSC",{
"exam_name": "RAILWAY","isNew": false
}]
我正在尝试获得具有唯一exam_name
的结果,以使得如果exam_name
具有至少1个exam_name
键,则对象的结果数组也具有唯一isNew
值如果为true,则结果对象应具有isNew
true
的属性,如果不是false
。
预期结果-
"datawithisNew": [
{
"exam_name": "MPSC","isNew": false
}]
我正在使用的代码是-
var helper1 = {};
var result2 = data12.reduce(function(r,o) {
var key = o.exam_name ;
if(!helper1[key]) {
helper1[key] = Object.assign({},o); // create a copy of o
r.push(helper1[key]);
} else {
helper1[key].exam_name_rating += o.exam_name_rating;
}
return r;
},[]);
但这只是返回唯一的exam_name
对象,如果isNew
至少出现一次true
一次,它也应该有exam_name
,但我也需要isNew:true
键为真,否则为isNew:false
解决方法
使用JS Array.filter
过滤出重复项
const datawithisNew = [{
"exam_name": "MPSC","isNew": false
},{
"exam_name": "MPSC","isNew": true
},{
"exam_name": "UPSC",{
"exam_name": "RAILWAY","isNew": false
}
];
const uniqueItems = datawithisNew.filter((exam,index,self) => {
return self.findIndex(e => exam.exam_name === e.exam_name) === index
}).map(exam => {
if (!exam.isNew && datawithisNew.find(e => e.exam_name === exam.exam_name && e.isNew)) {
exam.isNew = true;
}
return exam;
});
console.log(uniqueItems);
,
使用您的datawithisNew作为参数调用以下函数
function getUniqueExams(data){
let finalObjMap = { };
for(var i=0;i<data.length;i++){
let currentObj = data[i];
if(finalObjMap[currentObj["exam_name"]])
{
if(!finalObjMap[currentObj["isNew"]] && currentObj["isNew"])
finalObjMap[currentObj["exam_name"]]["isNew"]=true;
}
else
{
finalObjMap[currentObj["exam_name"]]={"isNew":currentObj["isNew"]};
}
}
let finalData=[];
Object.keys(finalObjMap).forEach((key)=>{
let tempExamObj = { "exam_name": key,"isNew": finalObjMap[key]["isNew"]};
finalData.push(tempExamObj);
});
return finalData;
};
var datawithisNew=[
{
"exam_name": "MPSC","isNew": false
},{
"exam_name": "MPSC","isNew": true
},{
"exam_name": "UPSC",{
"exam_name": "RAILWAY","isNew": false
}];
console.log(getUniqueExams(datawithisNew));
,
您离实际解决方案不远,在下面添加以下行即可解决您的问题:
helper1[key].isNew ||= o.isNew;
如果当前值不正确, ||=
将为值分配一个变量或属性。
如果由于logical OR assignment(||=
)是一个相当新的赋值运算符而不能使用它,则可以使用:
if (!helper1[key].isNew) helper1[key].isNew = o.isNew;
const data12 = [
{ "exam_name": "MPSC","isNew": false },{ "exam_name": "MPSC","isNew": true },{ "exam_name": "UPSC",{ "exam_name": "RAILWAY",];
var helper1 = {};
var result2 = data12.reduce(function(r,o) {
var key = o.exam_name ;
if(!helper1[key]) {
helper1[key] = Object.assign({},o); // create a copy of o
r.push(helper1[key]);
} else {
helper1[key].exam_name_rating += o.exam_name_rating;
helper1[key].isNew ||= o.isNew; // <- added this line
}
return r;
},[]);
console.log(result2);
由于示例数据不包含exam_name_rating
属性,因此结果将丢失或设置为NaN
。我认为此属性在您自己的数据中可用。