考虑这个非常简单的代码:
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}}到newFont
(oldFonts
),如果它尚不存在(oldFonts.push
)。
fb.equals
和oldFonts
是具有newFonts
和name
属性的对象。两者都在host
中用于确定相等性。 fb.equals()
无效。
这正是我在PHP中的表现。它在JS中不起作用,因为JS不支持indexOf()
,这意味着继续2个级别。
我如何在JS中执行此操作?
continue 2
不会这样做,因为它仍会完成内循环并最终到达continue
push
不会这样做,因为它会跳过内循环并直接跳到break
push
不会这样做,因为我不想在必须忽略ONE时跳过所有break someLabel
如果没有单一功能,这一定是可能的......
答案 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);
}