[英]Javascript Array sorting unique object with a key value condition
我有一個數組
"datawithisNew": [
{
"exam_name": "MPSC",
"isNew": false
},
{
"exam_name": "MPSC",
"isNew": true
},
{
"exam_name": "UPSC",
"isNew": false
},
{
"exam_name": "RAILWAY",
"isNew": false
},
{
"exam_name": "RAILWAY",
"isNew": false
}]
我想獲得獨特的結果exam_name
這樣的對象,導致陣列保存唯一exam_name
值也如果exam_name
有ATLEAST 1個isNew
鍵為真,將產生的對象應該具有與物業isNew
true
,如果不是false
。 預期結果——
"datawithisNew": [
{
"exam_name": "MPSC",
"isNew": true
},
{
"exam_name": "UPSC",
"isNew": false
},
{
"exam_name": "RAILWAY",
"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
如果發生ATLEAST其關鍵true
ATLEAST一次的exam_name
它應該有isNew:true
為真或者isNew:false
使用 JS Array.filter
過濾掉重復項
const datawithisNew = [{ "exam_name": "MPSC", "isNew": false }, { "exam_name": "MPSC", "isNew": true }, { "exam_name": "UPSC", "isNew": false }, { "exam_name": "RAILWAY", "isNew": false }, { "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",
"isNew": false
},
{
"exam_name": "RAILWAY",
"isNew": false
},
{
"exam_name": "RAILWAY",
"isNew": false
}];
console.log(getUniqueExams(datawithisNew));
您離實際解決方案不遠,添加以下行可以解決您的問題:
helper1[key].isNew ||= o.isNew;
如果當前值為假, ||=
會將變量或屬性分配給一個值。
如果您不能使用邏輯 OR 賦值( ||=
) 運算符,因為它是一個相當新的賦值運算符,您可以使用:
if (!helper1[key].isNew) helper1[key].isNew = o.isNew;
const data12 = [ { "exam_name": "MPSC", "isNew": false }, { "exam_name": "MPSC", "isNew": true }, { "exam_name": "UPSC", "isNew": false }, { "exam_name": "RAILWAY", "isNew": false }, { "exam_name": "RAILWAY", "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; helper1[key].isNew ||= o.isNew; // <- added this line } return r; }, []); console.log(result2);
由於示例數據不包含exam_name_rating
屬性,它將丟失,或者結果設置為NaN
。 我假設此屬性在您自己的數據中可用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.