簡體   English   中英

如何基於JS中的子值獲取父JSON對象

[英]How to get parent JSON object based on child value in JS

我的JSON如下:

[ RowDataPacket {
    workflowId: 1,
    stepId: 1,
    workflowTypeId: 4,
    baseFieldId: 3,
    relatedFieldId: 0,
    relatedValue: 'YES',
    nextTrueStepId: 2,
    nextFalseStepId: 4 },
  RowDataPacket {
    workflowId: 1,
    stepId: 2,
    workflowTypeId: 2,
    baseFieldId: 4,
    relatedFieldId: 0,
    relatedValue: '',
    nextTrueStepId: 3,
    nextFalseStepId: 4 },
  RowDataPacket {
    workflowId: 1,
    stepId: 3,
    workflowTypeId: 9,
    baseFieldId: 5,
    relatedFieldId: 0,
    relatedValue: 'SUBMITTED',
    nextTrueStepId: 4,
    nextFalseStepId: 0 },
  RowDataPacket {
    workflowId: 1,
    stepId: 4,
    workflowTypeId: 10,
    baseFieldId: 0,
    relatedFieldId: 0,
    relatedValue: '',
    nextTrueStepId: 0,
    nextFalseStepId: 0 } ]

如何獲得子元素具有nextTrueStepId = 3的父級(例如arr [parentID])?

我正在使用像這樣的forEach,但是它依次迭代行:

 arr.forEach(function(row) {
      nextStep = processFlowRow(row, Id);
     });

編輯:傑森現在看起來像下面,但是當我調用arr [0]時,我只是返回“ [”而不是該行?

[
{
    "workflowId": 1,
    "stepId": 1,
    "workflowTypeId": 4,
    "baseFieldId": 3,
    "relatedFieldId": 0,
    "relatedValue": "yes",
    "nextTrueStepId": 2,
    "nextFalseStepId": 4
},
{
    "workflowId": 1,
    "stepId": 2,
    "workflowTypeId": 2,
    "baseFieldId": 4,
    "relatedFieldId": 0,
    "relatedValue": "",
    "nextTrueStepId": 3,
    "nextFalseStepId": 4
},
{
    "workflowId": 1,
    "stepId": 3,
    "workflowTypeId": 9,
    "baseFieldId": 1,
    "relatedFieldId": 0,
    "relatedValue": "SUBMITTED",
    "nextTrueStepId": 4,
    "nextFalseStepId": 0
}

]

嘗試這個:

//Assuming your data is in a variable named jsonObj
jsonObj.filter(function(elem){
    return elem.nextTrueStepId===3;
})

修復JSON數據中的錯誤並將其存儲到input ,假設您只希望匹配一個項目:

input.find(item=>item.nextTrueStepId === 3)

代碼段(請注意是ES6!):

 var input = [{ "workflowId": 1, "stepId": 1, "workflowTypeId": 4, "baseFieldId": 3, "relatedFieldId": 0, "relatedValue": "yes", "nextTrueStepId": 2, "nextFalseStepId": 4 }, { "workflowId": 1, "stepId": 2, "workflowTypeId": 2, "baseFieldId": 4, "relatedFieldId": 0, "relatedValue": "", "nextTrueStepId": 3, "nextFalseStepId": 4 }, { "workflowId": 1, "stepId": 3, "workflowTypeId": 9, "baseFieldId": 1, "relatedFieldId": 0, "relatedValue": "SUBMITTED", "nextTrueStepId": 4, "nextFalseStepId": 0 }] console.log(input.find(item=>item.nextTrueStepId === 3)) 

我制作了3種解決方案,也添加了ES5版本,將它們包裝在可重用的函數中,然后還測試了執行速度(僅函數,在設置JS中聲明函數不在基准范圍內)。

最新版本,ES5 for loop也是最快的方式。 雖然編寫的代碼更多,但可讀性卻更低。 基准: https : //jsbench.me/r8izihgj9w/2

 var input = [{ "workflowId": 1, "stepId": 1, "workflowTypeId": 4, "baseFieldId": 3, "relatedFieldId": 0, "relatedValue": "yes", "nextTrueStepId": 2, "nextFalseStepId": 4 }, { "workflowId": 1, "stepId": 2, "workflowTypeId": 2, "baseFieldId": 4, "relatedFieldId": 0, "relatedValue": "", "nextTrueStepId": 3, "nextFalseStepId": 4 }, { "workflowId": 1, "stepId": 3, "workflowTypeId": 9, "baseFieldId": 1, "relatedFieldId": 0, "relatedValue": "SUBMITTED", "nextTrueStepId": 4, "nextFalseStepId": 0 }] function findItem3(x) { for (i=input.length-1; i>=0; i--) { if (input[i].nextTrueStepId === 3) return input[i] } return {} } function findItem2(x) { return input.find(item => item.nextTrueStepId === x) } function findItem1(x) { return input.filter(function(elem){ return elem.nextTrueStepId===x; }) } console.log(findItem1(3)) console.log(findItem2(3)) console.log(findItem3(3)) 

除了其他解決方案,您還可以使用Array#some早日返回函數,該函數用於在具有對象的數組內部查找特殊鍵和值。

該函數返回與所需模式匹配的第一個對象。

 function getObject(array, key, value) { var object; array.some(function (o) { if (o[key] === value) { object = o; return true; } }); return object; } var data = [{ workflowId: 1, stepId: 1, workflowTypeId: 4, baseFieldId: 3, relatedFieldId: 0, relatedValue: "yes", nextTrueStepId: 2, nextFalseStepId: 4 }, { workflowId: 1, stepId: 2, workflowTypeId: 2, baseFieldId: 4, relatedFieldId: 0, relatedValue: 0, nextTrueStepId: 3, nextFalseStepId: 4 }, { workflowId: 1, stepId: 3, workflowTypeId: 9, baseFieldId: 1, relatedFieldId: 0, relatedValue: "SUBMITTED", nextTrueStepId: 4, nextFalseStepId: 0 }]; console.log(getObject(data, 'nextTrueStepId', 3)); 

暫無
暫無

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

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