在没有函数调用的Array.push里面

时间:2017-01-15 17:51:48

标签: javascript arrays

我想在将元素写入数组之前执行更多逻辑:

tempDatensatz.push( () => {
    var current = window.dataForDataTable[i].outbounds[key].updatedAt;
    if (current) {
        return current.toString();
    } else {
        return "".toString();
    }
});

从该数组获取值将如下所示:

tempDatensatz[0]()

但是我想要相同的逻辑而不需要调用函数。我需要一个普通的数组,我得到一个像这样的值:

tempDatensatz[0]

我该怎么做?

更新 我把我的项目发布到gitHub,你可以看看你是否需要更好的理解:) https://github.com/te2020/GoEuro/blob/master/GoEuro/Views/Home/Index.cshtml

3 个答案:

答案 0 :(得分:0)

使用立即调用的函数而不仅仅是函数:

tempDatensatz.push( (function(){
    var current = window.dataForDataTable[i].outbounds[key].updatedAt;
    if (current) {
        return current.toString();
    } else {
        return "".toString();
    }
})());

该函数将在定义后立即执行,返回结果。所以push不会push对该函数的引用,而是推送它返回的值(结果)。

答案 1 :(得分:0)

您可以按如下方式编写代理:



    function makeProxy(array) {
      return new Proxy(array, {
        get(target, property) { 
          return !isNaN(property) ? target[property]() : target[property];
        }
      });
    }

    const tempDatensatz = [];
    const useThisOne = makeProxy(tempDatensatz);

    useThisOne.push(() => alert("Hi, Jane!"));
    useThisOne[0];




推送/写入数组将按预期工作,但检索其元素将通过get处理程序执行该函数。

答案 2 :(得分:0)

您可以使用表达式,例如:

tempDatensatz.push( 
    window.dataForDataTable[i].outbounds[key].updatedAt
       ? window.dataForDataTable[i].outbounds[key].updatedAt.toString()
       : ''
);

对于更复杂的表达式,您通常可以使用三元运算符。对于上面看起来像这样:

var tempDatensatz = 
    ['companyId', 'mode', 'duration', 'outboundId', 'journeyId', 'departureTime', 
     'arrivalTime', 'stops', 'price', 'updatedAt', 'segments']
        .map( prop => (window.dataForDataTable[i].outbounds[key][prop] || '').toString() );

您的代码

在查看您关联的Azure B2C : Integration with IdentityServer时,您可以使用此“oneliner”完成所有操作:

{{1}}