在Javascript中,是否有相当于“find if”,或者是一种紧凑的方式来做我正在尝试做的事情?

时间:2015-05-21 23:34:24

标签: javascript c++ algorithm

我有一段丑陋的Javascript代码

for (var k = 0; k < ogmap.length; ++k)
{
    if (ogmap[k]["orgname"] == curSelectedOrg)
    {
        ogmap[k]["catnames"].push(newCatName);
        break;
    }
} 

实际上,我的网络应用程序中有很多这样的部分。

我想知道是否有办法让它更漂亮和更紧凑。我知道在其他语言中有很好的方法可以做到这一点,例如在C#中使用find_if或在C#中使用FirstOrDefault或在C#中使用花哨的LINQ查询。

至少,帮助我使其更具可读性。

2 个答案:

答案 0 :(得分:2)

我会说你可以自己编写一个实用函数,然后在必要时使用它。

// finds the first object in the array that has the desired property
// with a value that matches the passed in val
// returns the index in the array of the match
// or returns -1 if no match found
function findPropMatch(array, propName, val) {
   var item;
   for (var i = 0; i < array.length; i++) {
       item = array[i];
       if (typeof item === "object" && item[propName] === val) {
           return i;
       }
   }
   return -1;
}

然后,您可以像这样使用它:

var match = findPropMatch(ogmap, "orgname", curSelectedOrg);
if (match !== -1) {
    ogmap[match]["catnames"].push(newCatName);
}

答案 1 :(得分:1)

var find_if = function (arr, pred) {
    var i = -1;
    arr.some(function (item, ind) {
        if (pred(item)) {
            i = ind;
            return true;
        }
    });
    return i;
}

称之为

var item_or_last = find_if(_.range(ogmap.length), function (item) {
    return item["orgname"] == curSelectedOrg
});

或没有underscore.js

var range = function (a, b) {
    var low = a < b ? a : b;
    var high = a > b ? a : b;
    var ret = [];
    while (low < high) {
        ret.push(low++);
    }
    return ret;  
}
var item_or_last = find_if(range(0, ogmap.length), function (item) {
    return item["orgname"] == curSelectedOrg
});

这使您可以声明要查找的内容,而不是循环遍历项目并检查每个项目。