2017-05-29 90 views
1

一旦選擇了對象,一些節點連接在一起並且這些鏈接存儲在linkArray[]中,則對象將被添加到nodeArray[],每個對象保存節點的源ID和目標ID連接。通過匹配來自另一個陣列的多個值來過濾數組

我需要篩選linkArray[],以便它只返回sourcetarget位於nodeArray[]之內的對象。

所以從瀏覽類似的問題,到目前爲止,我有以下幾點:

var linkArray = [{ 
 
    "conID": "100", 
 
    "source": "10", 
 
    "target": "11" 
 
}, { 
 
    "conID": "101", 
 
    "source": "11", 
 
    "target": "12" 
 
}, { 
 
    "conID": "102", 
 
    "source": "12", 
 
    "target": "13" 
 
}, { 
 
    "conID": "103", 
 
    "source": "13", 
 
    "target": "14" 
 
}, { 
 
    "conID": "386", 
 
    "source": "55", 
 
    "target": "32" 
 
}]; 
 
var nodeArray = [{"id": "10"}, {"id": "11"}, {"id": "12"}]; 
 

 
function filterArray(array, filter) { 
 
    var myArrayFiltered = []; 
 
    for (var i = 0; i < array.length; i++) { 
 
    for (var j = 0; j < filter.length; j++) { 
 
     if (array[i].source === filter[j].id) { 
 
     myArrayFiltered.push(array[i]); 
 
     } 
 
    } 
 
    } 
 
    return myArrayFiltered; 
 
} 
 

 
myArrayFiltered = filterArray(linkArray, nodeArray); 
 

 
document.body.innerHTML = '<pre>' + JSON.stringify(myArrayFiltered, null, 4) + '</pre>';

我已經嘗試添加if語句,包括目標ID,以及,但林不知道我很理解它正確。

結果將返回與source匹配的所有鏈接nodeArray[]匹配id

[ 
    { 
     "conID": "100", 
     "source": "10", 
     "target": "11" 
    }, 
    { 
     "conID": "101", 
     "source": "11", 
     "target": "12" 
    }, 
    { 
     "conID": "102", 
     "source": "12", 
     "target": "13" 
    } 
] 

什麼,我需要被過濾陣列有助於使它只返回其中兩個sourcetarget ID是nodeArray[]對象。

選擇節點10,11和12後,所需的結果將只是2個對象,因爲節點13不在選擇中。

[ 
    { 
     "conID": "100", 
     "source": "10", 
     "target": "11" 
    }, 
    { 
     "conID": "101", 
     "source": "11", 
     "target": "12" 
    } 
] 

希望這是明確的,謝謝!

回答

4

你可以試試這個

var linkArray = [{ 
 
    "conID": "100", 
 
    "source": "10", 
 
    "target": "11" 
 
}, { 
 
    "conID": "101", 
 
    "source": "11", 
 
    "target": "12" 
 
}, { 
 
    "conID": "102", 
 
    "source": "12", 
 
    "target": "13" 
 
}, { 
 
    "conID": "103", 
 
    "source": "13", 
 
    "target": "14" 
 
}, { 
 
    "conID": "386", 
 
    "source": "55", 
 
    "target": "32" 
 
}]; 
 
var nodeArray = [{ 
 
    "id": "10" 
 
}, { 
 
    "id": "11" 
 
}, { 
 
    "id": "12" 
 
}]; 
 

 
function filterArray(array, filter) { 
 
    // Get all the required ids 
 
    var ids = filter.map(function(f) { 
 
    return f.id; 
 
    }); 
 
    return array.filter(function(a) { 
 
    // Check if both source and target are present in list of ids 
 
    return ids.indexOf(a.source) !== -1 && ids.indexOf(a.target) !== -1; 
 
    }); 
 
} 
 

 
var myArrayFiltered = filterArray(linkArray, nodeArray); 
 
console.log(myArrayFiltered)

UPDATE

刪除forEach + push和使用filter

+0

謝謝,很好! – MattStudios

1

您可以使用散列表ids並針對這些值進行測試。

var linkArray = [{ conID: "100", source: "10", target: "11" }, { conID: "101", source: "11", target: "12" }, { conID: "102", source: "12", target: "13" }, { conID: "103", source: "13", target: "14" }, { conID: "386", source: "55", target: "32" }], 
 
    nodeArray = [{ id: "10" }, { id: "11" }, { id: "12" }], 
 
    ids = nodeArray.reduce(function (o, a) { 
 
     o[a.id] = true; 
 
     return o; 
 
    }, Object.create(null)), 
 
    result = linkArray.filter(function (a) { 
 
     return ids[a.source] && ids[a.target]; 
 
    }); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

ES6與

  • Set對於想id
  • Array#filter對於只獲得符合誰的項目,
  • 一個keys陣列與通緝屬性匹配['source', 'target'],
  • Array#every用於檢查所有密鑰,
  • Set#has,用於檢查所需密鑰是否在該組中。

var links = [{ conID: "100", source: "10", target: "11" }, { conID: "101", source: "11", target: "12" }, { conID: "102", source: "12", target: "13" }, { conID: "103", source: "13", target: "14" }, { conID: "386", source: "55", target: "32" }], 
 
    nodes = [{ id: "10" }, { id: "11" }, { id: "12" }], 
 
    keys = ['source', 'target'], 
 
    result = links.filter(
 
     (s => a => keys.every(k => s.has(a[k])))(new Set(nodes.map(n => n.id))) 
 
    ); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

0

您可以使用Array#filter

nodeArray.find(n=>n.id === e.source) && nodeArray.find(n=>n.id === e.target) 

條件使用Array#find以下條件的條件 - 它會返回undefined,如果它沒有找到與節點來源或目標編號

var linkArray = [{"conID": "100","source": "10","target": "11"}, {"conID": "101","source": "11","target": "12"}, {"conID": "102", "source": "12", "target": "13"}, {"conID": "103","source": "13","target": "14"}, {"conID": "386","source": "55","target": "32" }]; 
 
var nodeArray = [{"id": "10"}, {"id": "11"}, {"id": "12"}]; 
 

 
var filteredArray = linkArray.filter(e=> nodeArray.find(n=>n.id === e.source) && nodeArray.find(n=>n.id === e.target)); 
 

 
console.log(filteredArray);

0

你可以把你nodeArray到鍵值,並用它來檢查每個對象都sourcetargetlinkArray

var linkArray = [{"conID": "100","source": "10","target": "11"}, {"conID": "101","source": "11","target": "12"}, {"conID": "102", "source": "12", "target": "13"}, {"conID": "103","source": "13","target": "14"}, {"conID": "386","source": "55","target": "32" }]; 
 

 
var nodeArray = [{"id": "10"}, {"id": "11"}, {"id": "12"}]; 
 

 
var nodes ={}; 
 
var myArrayFiltered = []; 
 

 
for(var i =0; i<nodeArray.length;i++){ 
 
    nodes[nodeArray[i].id] = true; 
 
} 
 

 
for(var i =0; i<linkArray.length;i++){ 
 
    if(nodes[linkArray[i].source] && nodes[linkArray[i].target]) 
 
    myArrayFiltered.push(linkArray[i]) 
 
} 
 

 
console.log(myArrayFiltered)

0

var linkArray = [{ 
 
    "conID": "100", 
 
    "source": "10", 
 
    "target": "11" 
 
}, { 
 
    "conID": "101", 
 
    "source": "11", 
 
    "target": "12" 
 
}, { 
 
    "conID": "102", 
 
    "source": "12", 
 
    "target": "13" 
 
}, { 
 
    "conID": "103", 
 
    "source": "13", 
 
    "target": "14" 
 
}, { 
 
    "conID": "386", 
 
    "source": "55", 
 
    "target": "32" 
 
}]; 
 
var nodeArray = [{"id": "10"}, {"id": "11"}, {"id": "12"}]; 
 

 
function filterArray(array, filter) { 
 
    // map the nodeArray to an array of ids: ["10", "11", "12"] 
 
    // could be done outside the function if needed 
 
    var ids = nodeArray.map(function(item) {return item.id}); 
 

 
    // filter the array only returning itemes that have 'target' and 'source' in ids 
 
    return array.filter(function(item) { 
 
    return ids.includes(item.target) && ids.includes(item.source) 
 
    }) 
 
} 
 

 
myArrayFiltered = filterArray(linkArray, nodeArray); 
 

 
document.body.innerHTML = '<pre>' + JSON.stringify(myArrayFiltered, null, 4) + '</pre>';

相關問題