2017-05-26 37 views
0

我有一個對象數組,我需要在數組中找到它們的位置,其中關鍵ecommerce_order_number值與搜索的數字相匹配。返回具有與搜索條件相匹配的關鍵字的數組的所有索引

我試着做一個for循環,但我可以看到,這不是一個好主意,因爲可能有500 +檢查即時對陣數字我有這是單獨的。

通常我會循環,並獲得所有的比賽,並繼續離開那裏。但林希望有一個更清潔的方法使用香草的JavaScript。

var myTransactions = []; 
myTransactions[0].order = 'S17243'; 


for(i=0; i < myTransactions.length; i++) 
{ 
// 
} 

但我可以看到我的循環將僅限於事務計數的數量,如果比這確實發生了交易的數量有更多的支付,我將無法獲得的各項指標付款數組匹配。

是否有一個函數可以搜索一個對象數組並返回找到的所有鍵的索引以匹配一個特定的字符串?

var payments= [{ 
     "id": "11419", 
     "recordtype": "payment", 
     "cols": { 
      "entity": { 
       "name": "Angela smith", 
       "id": "6641" 
      }, 
      "account": { 
       "name": "test-data", 
       "id": "335" 
      }, 
      "amount": 3810.2, 
      "ecommerce_order_number": "S17247", 
      "datecreated": "10/4/2017 5:42 PM" 
     } 
    }, { 
     "id": "11420", 
     "recordtype": "payment", 
     "cols": { 
      "entity": { 
       "name": "Paul Georgeson", 
       "id": "6640" 
      }, 
      "account": { 
       "name": "test-data", 
       "id": "335" 
      }, 
      "amount": 3539, 
      "ecommerce_order_number": "S17223", 
      "datecreated": "10/4/2017 5:42 PM" 
     } 
    }, { 
     "id": "11421", 
     "recordtype": "payment", 
     "cols": { 
      "entity": { 
       "name": "Leanne Smithy", 
       "id": "6638" 
      }, 
      "account": { 
       "name": "test-data", 
       "id": "336" 
      }, 
      "amount": 1617.2, 
      "ecommerce_order_number": "S17243", 
      "datecreated": "10/4/2017 5:42 PM" 
     } 
    }]; 
+0

變種IDS = array.reduce((ARR,EL,I)=>(el.sth ===真&& arr.push(i))的|| ARR,[]) –

回答

0
var payments= [{ 
    "id": "11419", 
    "recordtype": "payment", 
    "cols": { 
     "entity": { 
      "name": "Angela smith", 
      "id": "6641" 
     }, 
     "account": { 
      "name": "test-data", 
      "id": "335" 
     }, 
     "amount": 3810.2, 
     "ecommerce_order_number": "S17247", 
     "datecreated": "10/4/2017 5:42 PM" 
    } 
}, { 
    "id": "11420", 
    "recordtype": "payment", 
    "cols": { 
     "entity": { 
      "name": "Paul Georgeson", 
      "id": "6640" 
     }, 
     "account": { 
      "name": "test-data", 
      "id": "335" 
     }, 
     "amount": 3539, 
     "ecommerce_order_number": "S17223", 
     "datecreated": "10/4/2017 5:42 PM" 
    } 
}, { 
    "id": "11421", 
    "recordtype": "payment", 
    "cols": { 
     "entity": { 
      "name": "Leanne Smithy", 
      "id": "6638" 
     }, 
     "account": { 
      "name": "test-data", 
      "id": "336" 
     }, 
     "amount": 1617.2, 
     "ecommerce_order_number": "S17243", 
     "datecreated": "10/4/2017 5:42 PM" 
    } 
}]; 


var ids=payments.reduce((arr,el,i)=>(el.cols&&el.cols.ecommerce_order_number.includes("S17243")&&!arr.push(i))||a‌​rr,[]); 

你可以使用Array.prototype.reduce方法...

長篇:

var ids=payments.reduce((arr,el,i)=>{ 
if(el.cols&&el.cols.ecommerce_order_number.includes("S17243")) arr.push(i); 
return arr; 
},[]); 

http://jsbin.com/jucexilude/edit?console

0

我也有類似的情況,我做到了使用Array.map

var payments= [{ 
     "id": "11419", 
     "recordtype": "payment", 
     "cols": { 
      "entity": { 
       "name": "Angela smith", 
       "id": "6641" 
      }, 
      "account": { 
       "name": "test-data", 
       "id": "335" 
      }, 
      "amount": 3810.2, 
      "ecommerce_order_number": "S17247", 
      "datecreated": "10/4/2017 5:42 PM" 
     } 
    }, { 
     "id": "11420", 
     "recordtype": "payment", 
     "cols": { 
      "entity": { 
       "name": "Paul Georgeson", 
       "id": "6640" 
      }, 
      "account": { 
       "name": "test-data", 
       "id": "335" 
      }, 
      "amount": 3539, 
      "ecommerce_order_number": "S17223", 
      "datecreated": "10/4/2017 5:42 PM" 
     } 
    }, { 
     "id": "11421", 
     "recordtype": "payment", 
     "cols": { 
      "entity": { 
       "name": "Leanne Smithy", 
       "id": "6638" 
      }, 
      "account": { 
       "name": "test-data", 
       "id": "336" 
      }, 
      "amount": 1617.2, 
      "ecommerce_order_number": "S17243", 
      "datecreated": "10/4/2017 5:42 PM" 
     } 
    }]; 

var arrOfIndexes = payments.map((payment, index, completeArr) => { 
         if(payment.cols.ecommerce_order_number === "S17243") { 
          return index; 
         } else { return null } 
        }).filter(Boolean); // filter used to remove falsey values 
console.log(arrOfIndexes); 
0

您可以使用jQuery grep功能,以便與特定的屬性值來檢索所有的對象,那麼你可以,如果你需要得到只有ID,請參見下面請:

獲取所有的與ecommerce_order_number = 「S17243」 對象:

var filteredObj = $.grep(payments, function(obj) { 
    return obj.cols.ecommerce_order_number === "S17243"; 
}); 

獲取僅上述目的的ID:

var onlyIds = filteredObj.map(function(obj) {return obj.id;}); 

合併在一個行指令上述代碼:

var oneLineObj = $.grep(payments, function(obj) { 
    return obj.cols.ecommerce_order_number === "S17243"; 
}).map(function(obj) {return obj.id;}); 

參見下面的示例請:

var payments= [{ 
 
     "id": "11419", 
 
     "recordtype": "payment", 
 
     "cols": { 
 
      "entity": { 
 
       "name": "Angela smith", 
 
       "id": "6641" 
 
      }, 
 
      "account": { 
 
       "name": "test-data", 
 
       "id": "335" 
 
      }, 
 
      "amount": 3810.2, 
 
      "ecommerce_order_number": "S17247", 
 
      "datecreated": "10/4/2017 5:42 PM" 
 
     } 
 
    }, { 
 
     "id": "11420", 
 
     "recordtype": "payment", 
 
     "cols": { 
 
      "entity": { 
 
       "name": "Paul Georgeson", 
 
       "id": "6640" 
 
      }, 
 
      "account": { 
 
       "name": "test-data", 
 
       "id": "335" 
 
      }, 
 
      "amount": 3539, 
 
      "ecommerce_order_number": "S17223", 
 
      "datecreated": "10/4/2017 5:42 PM" 
 
     } 
 
    }, { 
 
     "id": "11421", 
 
     "recordtype": "payment", 
 
     "cols": { 
 
      "entity": { 
 
       "name": "Leanne Smithy", 
 
       "id": "6638" 
 
      }, 
 
      "account": { 
 
       "name": "test-data", 
 
       "id": "336" 
 
      }, 
 
      "amount": 1617.2, 
 
      "ecommerce_order_number": "S17243", 
 
      "datecreated": "10/4/2017 5:42 PM" 
 
     } 
 
    }, { 
 
     "id": "test", 
 
     "recordtype": "payment", 
 
     "cols": { 
 
      "entity": { 
 
       "name": "Alessandro", 
 
       "id": "1" 
 
      }, 
 
      "account": { 
 
       "name": "test-data", 
 
       "id": "336" 
 
      }, 
 
      "amount": 5000.2, 
 
      "ecommerce_order_number": "S17243", 
 
      "datecreated": "18/5/2017 5:42 PM" 
 
     } 
 
    }]; 
 

 

 
var filteredObj = $.grep(payments, function(obj) { 
 
    return obj.cols.ecommerce_order_number === "S17243"; 
 
}); 
 

 
var onlyIds = filteredObj.map(function(obj) {return obj.id;}); 
 

 
console.log("IDS: ", onlyIds); 
 
console.log("COMPLETE OBJECTS: ", filteredObj); 
 

 
var oneLineObj = $.grep(payments, function(obj) { 
 
    return obj.cols.ecommerce_order_number === "S17243"; 
 
}).map(function(obj) {return obj.id;}); 
 

 
console.log(oneLineObj);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

0

純javascri點,沒有jQuery的解決方案。

您可以使用新的陣列助手:.filter.find


.filter解決方案如果你希望有一個以上的結果。

const resultFiler = payments.filter(payment => { 
    if (payment.cols.ecommerce_order_number === searchValue) { 
    return payment; 
    } 
}).map(payment => payment.id); 

.filter助手只返回完整的數組元素。我們無法做到像return payment.id這樣的事情,因爲我們只關心.id財產。我們用.map(payment => payment.id);


.find解決方案,如果你希望只有一個結果。

const resultFind = payments.find(payment => { 
    if (payment.cols.ecommerce_order_number === searchValue) { 
    return payment; 
    } 
}).id; 

如果你不熟悉的脂肪箭頭/ ES6語法這裏是等效代碼:

var resultFiler = payments.filter(function (payment) { 
    if (payment.cols.ecommerce_order_number === searchValue) { 
    return payment; 
    } 
}).map(function (payment) { 
    return payment.id; 
}); 

// Using find 
var resultFind = payments.find(function (payment) { 
    if (payment.cols.ecommerce_order_number === searchValue) { 
    return payment; 
    } 
}).id; 

見工作示例。

var payments= [{ 
 
     "id": "11419", 
 
     "recordtype": "payment", 
 
     "cols": { 
 
      "entity": { 
 
       "name": "Angela smith", 
 
       "id": "6641" 
 
      }, 
 
      "account": { 
 
       "name": "test-data", 
 
       "id": "335" 
 
      }, 
 
      "amount": 3810.2, 
 
      "ecommerce_order_number": "S17247", 
 
      "datecreated": "10/4/2017 5:42 PM" 
 
     } 
 
    }, { 
 
     "id": "11420", 
 
     "recordtype": "payment", 
 
     "cols": { 
 
      "entity": { 
 
       "name": "Paul Georgeson", 
 
       "id": "6640" 
 
      }, 
 
      "account": { 
 
       "name": "test-data", 
 
       "id": "335" 
 
      }, 
 
      "amount": 3539, 
 
      "ecommerce_order_number": "S17223", 
 
      "datecreated": "10/4/2017 5:42 PM" 
 
     } 
 
    }, { 
 
     "id": "11421", 
 
     "recordtype": "payment", 
 
     "cols": { 
 
      "entity": { 
 
       "name": "Leanne Smithy", 
 
       "id": "6638" 
 
      }, 
 
      "account": { 
 
       "name": "test-data", 
 
       "id": "336" 
 
      }, 
 
      "amount": 1617.2, 
 
      "ecommerce_order_number": "S17243", 
 
      "datecreated": "10/4/2017 5:42 PM" 
 
     } 
 
    }]; 
 
    
 
const searchValue = "S17243" 
 
// Find all matching occurrences 
 
    
 
const resultFiler = payments.filter(payment => { 
 
    if (payment.cols.ecommerce_order_number === searchValue) { 
 
    return payment; 
 
    } 
 
}).map(payment => payment.id); 
 

 

 
// Using find 
 
const resultFind = payments.find(payment => { 
 
    if (payment.cols.ecommerce_order_number === searchValue) { 
 
    return payment; 
 
    } 
 
}).id; 
 

 
console.log(resultFiler); 
 
console.log(resultFind);

相關問題