2017-10-20 21 views
1

我經常使用Array.prototype.filter,我只希望有一個單獨的元素是真的。高效地訪問Array.prorotype.filter單項返回

由於過濾器返回結果的數組,我覺得自己需要經常訪問的元素,所以我做了什麼樣

knownRefundLogics.filter((refundLogic) => this.hasTag(refundLogic.underscoredName))[0] 

假設:

knownRefundLogics = [{ 
    "underscoredName": "express_full_refund", 
    "camelized": "expressFullRefund" 
}, { 
    "underscoredName": "express_partial_refund", 
    "camelized": "expressPartialRefund" 
}, { 
    "underscoredName": "express_no_refund", 
    "camelized": "expressNoRefund" 
}] 

hasTag(),做的方法在refundLogic元素的陣列上的includes()

有沒有一個更合適的方法來做到這一點,例如使用傳播運算符?

順便說一句,我知道我可能會分裂我的方法,只有一個truefalse值返回的方式,但我發現這是一個過度工程的解決方案。

+0

'Array.prototype.some()','Array.prototype.every()' – Andreas

+0

,可以用[Array.prototype.reduce()](HTTPS://顯影劑.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce),保證返回單個值 – Flying

+0

,但是您會推薦reduce()來過濾/檢查值的真實性嗎? –

回答

1

您可以使用Array#find函數,它返回第一個項目,它傳遞給定的條件。 filter也更快,因爲filter遍歷所有項目,然後你只得到第一個。 find找到第一個匹配的項目並打破循環。

從可以看到的例子,它迭代2次而不是3

const knownRefundLogics = [{ 
 
    "underscoredName": "express_full_refund", 
 
    "camelized": "expressFullRefund" 
 
}, { 
 
    "underscoredName": "express_partial_refund", 
 
    "camelized": "expressPartialRefund" 
 
}, { 
 
    "underscoredName": "express_no_refund", 
 
    "camelized": "expressNoRefund" 
 
}]; 
 

 
const foundItem = knownRefundLogics.find(item => { 
 

 
    console.log('Iteration'); 
 
    
 
    return item.camelized === 'expressPartialRefund'; 
 

 
}); 
 

 
console.log(foundItem);

+0

.find的問題是你需要使用polyfill,但我會接受答案,因爲我沒有在我的問題中指定。 –

2

使用Array#find()來代替 - 每當斷言返回true時,迭代停止,並且匹配項(不是陣列)立即返回:

const knownRefundLogics = [{"underscoredName":"express_full_refund","camelized":"expressFullRefund"},{"underscoredName":"express_partial_refund","camelized":"expressPartialRefund"},{"underscoredName":"express_no_refund","camelized":"expressNoRefund"}]; 
 

 
const demoHasTag = (t) => t === 'express_partial_refund'; 
 

 
const result = knownRefundLogics.find((refundLogic) => demoHasTag(refundLogic.underscoredName)); 
 

 
console.log(result);

0

如果你想要一個沒有polyfill的解決方案,好的老循環是你的朋友。

var knownRefundLogics = [{ 
 
    "underscoredName": "express_full_refund", 
 
    "camelized": "expressFullRefund" 
 
}, { 
 
    "underscoredName": "express_partial_refund", 
 
    "camelized": "expressPartialRefund" 
 
}, { 
 
    "underscoredName": "express_no_refund", 
 
    "camelized": "expressNoRefund" 
 
}]; 
 

 
var selected; 
 
for(var i = 0; i < knownRefundLogics.length; i++){ 
 
    let current = knownRefundLogics[i]; 
 
    if(current.underscoredName === 'express_partial_refund'){ 
 
    selected = current; 
 
    break; 
 
    } 
 
} 
 

 
console.log(selected);

這樣,您可以編寫自己的光填充工具。

function findInArray(array, test){ 
 
    for(var i = 0; i < array.length; i++){ 
 
    if(test(array[i], i, array)) return array[i]; 
 
    } 
 
} 
 

 
var knownRefundLogics = [{ 
 
    "underscoredName": "express_full_refund", 
 
    "camelized": "expressFullRefund" 
 
}, { 
 
    "underscoredName": "express_partial_refund", 
 
    "camelized": "expressPartialRefund" 
 
}, { 
 
    "underscoredName": "express_no_refund", 
 
    "camelized": "expressNoRefund" 
 
}]; 
 

 
console.log(findInArray(knownRefundLogics, function(item, index, array){ 
 
    return item.underscoredName === "express_partial_refund"; 
 
}));

+0

還是一個.for每個我猜?我仍然沒有聽到任何意見,在自動獲取過濾器功能的第一個也是唯一的元素 –

+0

號。與簡單的循環不同,你不能中斷forEach循環。 – Techniv

+0

有關過濾器的意見。它具有與forEach相同的缺點。它不能被中斷,它將被迫遍歷整個陣列。因此,如果您只需檢索驗證您的病情的第一次出現,則效率不高。 – Techniv