在JS

时间:2015-07-14 20:41:14

标签: javascript loops continue

考虑这个非常简单的代码:

someLabel:
for (var i=0; i<newFonts.length; i++) {
    var newFont = newFonts[i];

    for (var j=0; j<oldFonts.length; j++) {
        var oldFont = oldFonts[j];

        if (fb.equals(oldFont, newFont)) {
            // Break out of inner loop, don't finish outer iteration, continue with next outer item
            continue 2;
        }
    }

    // This must only happen if `newFont` doesn't match ANY `oldFonts`
    oldFonts.push(newFont);
}

假设要做的是将所有oldFonts 对象newFonts 对象进行比较,并仅添加{{ 1}}到newFontoldFonts),如果它尚不存在(oldFonts.push)。

fb.equalsoldFonts是具有newFontsname属性的对象。两者都在host中用于确定相等性。 fb.equals()无效。

这正是我在PHP中的表现。它在JS中不起作用,因为JS不支持indexOf(),这意味着继续2个级别。

我如何在JS中执行此操作?

  • continue 2不会这样做,因为它仍会完成内循环并最终到达continue
  • push不会这样做,因为它会跳过内循环并直接跳到break
  • push不会这样做,因为我不想在必须忽略ONE时跳过所有break someLabel

如果没有单一功能,这一定是可能的......

2 个答案:

答案 0 :(得分:2)

评论演示了如何继续使用带标签的声明。但至于你原来的问题,你可能更容易解决它:

var difference = function(x, y) {
    return x.filter(function(e) {return y.indexOf(e) < 0;});
};

// or oldFonts = ... if you prefer to mutate
var combinedFonts = oldFonts.concat(difference(newFonts, oldFonts));

<强>更新

如评论中所述,如果测试相等性的要求更加复杂,那么需要更多的东西。在我看来,这比标记循环的原始方法更简单:

var complement = function(pred, a, b) {
    return a.filter(function(x) {
        return !b.some(function(y) {return pred(x, y);});
    });
};

var sameName = function(a, b) {return a.name === b.name;};

var combinedFonts = oldFonts.concat(complement(sameName, newFonts, oldFonts));

您可以看到 on JSFiddle

我迫不及待地想要广泛使用胖箭。这是等效的:

var complement = (pred, a, b) => a.filter(x => !b.some(y => pred(x, y)));
var sameName = (a, b) => a.name === b.name;

答案 1 :(得分:0)

这样的事情可能有助于解决您的问题:

var oldfonts = ['courier new', 'comic sans', 'century gothic'];
var newfonts = ['times new roman', 'comic sans', 'wingdings'];
var addfonts = [];
for (var i = 0; i < newfonts.length; i++) {
    if (oldfonts.indexOf(newfonts[i]) < 0) { // if newfonts item doesnt exist in oldfonts array
        addfonts.push(newfonts[i]); // add it to addfonts array to be added to oldfonts array systematically after all different font items are found           
    }
}
for(var i = 0; i < addfonts.length; i++) {
    oldfonts.push(addfonts[i]); // push add fonts to oldfonts array
    console.log(oldfonts);
}