簡體   English   中英

減少具有嵌套對象的數組

[英]Reducing an array with nested objects

我有一個按“src”和“target”排序的數組,如下所示:

var sortedArr = [
  {
    "orig": {
      "src": "A",
      "target": "B",
      "connection": "apple"
    },
    "source": {},
    "target": {}
  },
  {
    "orig": {
      "src": "A",
      "target": "C",
      "connection": "banana"
    },
    "source": {},
    "target": {}
  },
  {
    "orig": {
      "src": "A",
      "target": "C"
      "connection": "banana"
    },
    "source": {},
    "target": {}
  },
  {
    "orig": {
      "src": "A",
      "target": "C",
      "connection": "pear"
    },
    "source": {},
    "target": {}
  },
  {
    "orig": {
      "src": "B",
      "target": "A",
      "connection": "pear"
    },
    "source": {},
    "target": {}
  },
{
    "orig": {
      "src": "B",
      "target": "A",
      "connection": "banana"
    },
    "source": {},
    "target": {}
  },
{
    "orig": {
      "src": "B",
      "target": "C",
      "connection": "apple"
    },
    "source": {},
    "target": {}
  }
]

我只需要保留每個“src”“目標”對中的一個。 每個不同的對將有一個新屬性“connectionsArr”,它是具有相同“src”和“target”的對的所有不同“連接”的數組。

這就像我將具有相同“src”和“target”的對象簡化為一個對象,並將它們的“connection”值連接到一個名為“connectionsArr”的數組屬性中。

在此示例中,我需要獲取結果:


var sortedArr = [
  {
    "orig": {
      "src": "A",
      "target": "B",
      "connection": "apple",
      "connectionsArr": ["apple"]
    },
    "source": {},
    "target": {}
  },
{
    "orig": {
      "src": "A",
      "target": "C",
      "connection": "pear",
      "connectionsArr": ["banana","pear"]
    },
    "source": {},
    "target": {}
  },
  {
    "orig": {
      "src": "B",
      "target": "A",
      "connection": "banana",
      "connectionsArr": ["pear","banana"]
    },
    "source": {},
    "target": {}
  },
  {
    "orig": {
      "src": "B",
      "target": "C",
      "connection": "apple",
      "connectionsArr": ["apple"]
    },
    "source": {},
    "target": {}
  }
  
]

這是需要審查的功能:

  function removeDups(sortedArr ){

    for(var i = 1; i < sortedArr.length; ){
      sortedArr[i-1].orig.connArr = [sortedArr[i-1].orig.connection]
        if(sortedArr[i-1].orig.src === sortedArr[i].orig.src && sortedArr[i-1].orig.target === sortedArr[i].orig.target){
          sortedArr[i-1].orig.connArr.push(sortedArr[i].orig.connection)
            sortedArr.splice(i, 1);
            } else {
            i++;
            }
        }
    return sortedArr;
    }  

var linksOneLine = removeDups(links);


您可以使用Array.prototype.reduce()來處理您的數組(刪除重復項並通過connectionArr屬性連接它們),請參閱代碼片段:

 const sortedArr = [ { "orig": { "src": "A", "target": "B", "connection": "apple" }, "source": {}, "target": {} }, { "orig": { "src": "A", "target": "C", "connection": "banana" }, "source": {}, "target": {} }, { "orig": { "src": "A", "target": "C", "connection": "banana" }, "source": {}, "target": {} }, { "orig": { "src": "A", "target": "C", "connection": "pear" }, "source": {}, "target": {} }, { "orig": { "src": "B", "target": "A", "connection": "pear" }, "source": {}, "target": {} }, { "orig": { "src": "B", "target": "A", "connection": "banana" }, "source": {}, "target": {} }, { "orig": { "src": "B", "target": "C", "connection": "apple" }, "source": {}, "target": {} } ]; const reducedArr = sortedArr.reduce((accum, item) => { // check if duplicate of item exist in accumulator let targIndex = -1; const accumOrig = accum.find((accItem, index) => { const isInAccum = (accItem.orig.src === item.orig.src && accItem.orig.target === item.orig.target); // get index of dulpicate in accumulator targIndex = isInAccum ? index : -1; return isInAccum; }); // if duplicates of object not found if (!accumOrig) { // update item with new prop 'connectionArr' return [ ...accum, { ...item, orig: { ...item.orig, connectionArr: [item.orig.connection] } } ]; } // update accum item. Append connection from duplicate item const accumTmp = accum[targIndex].orig.connectionArr; const nextConnectionArr = accumTmp ? [...accumTmp, item.orig.connection] : [item.orig.connection]; // remove duplicates of connection in array (connectionArr) accum[targIndex].orig.connectionArr = [...new Set(nextConnectionArr)]; return accum; }, []); console.log('reducedArr:', reducedArr);

為什么不對您的功能使用更簡單的方法並執行以下操作

let result = sortedArr.filter((prev, index) => {
    return sortedArr.findIndex((x) => {
    return x.orig.target == prev.orig.target && x.orig.src == prev.orig.src;}) == index;

});

您可以在TS Playground上查看結果

順便說一句,如果你願意,你可以刪除這些返回,因為從沒有大括號的箭頭函數返回達到相同的目標,返回是為了幫助你遵循每個邏輯步驟。 像這樣:

let result = sortedArr.filter((prev, index) => 
    sortedArr.findIndex((x) => 
        x.orig.target == prev.orig.target && x.orig.src == prev.orig.src) == index
)

暫無
暫無

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

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