簡體   English   中英

基於現有對象數組的多個屬性返回新的對象數組

[英]Return new array of objects based on several properties of existing array of objects

我正試圖弄清楚如何實現我的需要。 我的初始對象數組是70k個對象,每個對象有15個屬性。 通過過濾和映射,我將數據集下載到我認為的相關部分。 我需要根據每個對象的4個屬性返回一個新的對象數組,它們是重復的id's和每個code不同levels 我的過濾數據看起來像這樣。

const arr = [{id: "12345", level: "1", current: "Y", code: "1"}, 
             {id: "12345", level: "0", current: "N", code: "1"},
             {id: "54321", level: "1", current: "N", code: "201"},
             {id: "54321", level: "2", current: "Y", code: "201"}, 
             {id: "54321", level: "3", current: "N", code: "201"},
             {id: "54321", level: "0", current: "Y", code: "401"},
             {id: "54321", level: "1", current: "N", code: "401"},
             {id: "54321", level: "3", current: "N", code: "201"},
             {id: "54321", level: "0", current: "N", code: "301"},
             {id: "121212", level: "0", current: "N", code: "3"},
             {id: "121212", level: "1", current: "N", code: "3"}]

我需要實現的是每個codeY任何current的每個id ,我需要找到該code的最大level 因此,對於上面的示例,結果輸出將是一個對象數組,如下所示:

const result = [{id: "12345", max: "1", code: "1"}, 
                {id: "54321", max: "3", code: "201"},
                {id: "54321", max: "1", code: "401"}]

我甚至不確定我想要的是否可行,或者我是否以錯誤的方式思考它。 我整個上午一直在努力尋找解決方案。

您可以使用.filter().map()來獲取基於Y初始值,然后使用.filter() .reduce()來獲取最大值:

 const arr = [{id: "12345", level: "1", current: "Y", code: "1"}, {id: "12345", level: "0", current: "N", code: "1"}, {id: "54321", level: "1", current: "N", code: "201"}, {id: "54321", level: "2", current: "Y", code: "201"}, {id: "54321", level: "3", current: "N", code: "201"}, {id: "54321", level: "0", current: "Y", code: "401"}, {id: "54321", level: "1", current: "N", code: "401"}, {id: "54321", level: "3", current: "N", code: "201"}, {id: "54321", level: "0", current: "N", code: "301"}, {id: "121212", level: "0", current: "N", code: "3"}, {id: "121212", level: "1", current: "N", code: "3"}] let initialValues = arr.filter(x => x.current === "Y") .map(x => ({ id: x.id, max: x.level, code: x.code })); let result = arr.reduce((result,current) => { var value = result.find(x => x.id === current.id && x.code === current.code); if(!value) return result; if(value.max < current.level) { value.max = current.level; } return result; }, initialValues); console.log(result); 

您可以簡單地實現Array.reduce()Object destructuring 使用idcode的組合構造每個鍵的映射。 只需在地圖上使用Object.values()即可獲得所需的結果:

 const arr = [{id: "12345", level: "1", current: "Y", code: "1"}, {id: "12345", level: "0", current: "N", code: "1"}, {id: "54321", level: "1", current: "N", code: "201"}, {id: "54321", level: "2", current: "Y", code: "201"}, {id: "54321", level: "3", current: "N", code: "201"}, {id: "54321", level: "0", current: "Y", code: "401"}, {id: "54321", level: "1", current: "N", code: "401"}, {id: "54321", level: "3", current: "N", code: "201"}, {id: "54321", level: "0", current: "N", code: "301"}, {id: "121212", level: "0", current: "N", code: "3"}, {id: "121212", level: "1", current: "N", code: "3"}]; const result = Object.values(arr.reduce((a,{level,current, ...props})=>{ a[props.id+"_"+props.code] = a[props.id+"_"+props.code] || props; a[props.id+"_"+props.code].max = Math.max((a[props.id+"_"+props.code].max || 0), level); return a; },{})); console.log(result); 

您可以縮減為Map並獲取其值

 const arr = [{id: "12345", level: "1", current: "Y", code: "1"}, {id: "12345", level: "0", current: "N", code: "1"}, {id: "54321", level: "1", current: "N", code: "201"}, {id: "54321", level: "2", current: "Y", code: "201"}, {id: "54321", level: "3", current: "N", code: "201"}, {id: "54321", level: "0", current: "Y", code: "401"}, {id: "54321", level: "1", current: "N", code: "401"}, {id: "54321", level: "3", current: "N", code: "201"}, {id: "54321", level: "0", current: "N", code: "301"}, {id: "121212", level: "0", current: "N", code: "3"}, {id: "121212", level: "1", current: "N", code: "3"}]; const res = arr.reduce((a, b) => b.current === 'Y' ? a.set(b.id + b.code, (a.get(b.id + b.code) || { level: Number.MIN_SAFE_INTEGER }).level < b.level ? b : a.get(b.id + b.code)) : a, new Map); console.log([...res.values()]); 

const resultObject = (arr, filter) => arr.reduce((sum, element) => {
  const currentInSum = sum[element.id];
  const filterSatisfied = element.current === filter;
  const isHighestLevel = !currentInSum  || currentInSum.level < element.level;
  if(filterSatisfied && isHighestLevel){
     sum[element.id] = element;
  }
  return sum;
}, {});
const result = Object.values(resultObject(arr, "Y"));

基本上你想要使用一個對象,以便你可以檢查元素是否已經添加,如果當前級別高於​​已經添加的級別,則替換它,如果這是第一次出現,則只需將其添加到對象。

最后,只需從對象獲取所有值以將其轉換為數組,您不關心作為對象id的鍵。

這個算法需要O(n * 2)時間來執行,因為你必須運行arr一次,然后你必須將對象中的所有值轉換為數組

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM