我在Array中有一些简单的对象。我想基于对象属性将新对象添加到数组中(如果它们尚未包含在其中)。
var o = {text: 'foo'}
var a = [o]
var checkExisting = function (list, obj) {
list.forEach(function(elem) {
if (elem.text === obj) {
return true
}
}
}
checkExisting(a, 'foo')
这不起作用。我无法弄清楚为什么。任何帮助或替代方案都会很棒。
答案 0 :(得分:4)
因为您无法return
来自callback
中forEach
的价值,您可以使用for
,就像这样
var checkExisting = function (list, obj) {
for (var i = 0, len = list.length; i < len; i++) {
if (list[i].text === obj) {
return true;
}
}
}
答案 1 :(得分:1)
这可以与.every()
非常相似,因为.forEach()
始终返回undefined。所以你也不能把它链起来。
.every()
在.forEach()
之类的每个元素上运行一个方法,但如果它收到一个假值,它将中止。最后,如果每次迭代都返回true,它将返回true给调用者,否则它将返回false。
因为我们返回false以使其在找到值时中止(因此它不会继续迭代),所以我们必须在从checkExisting
返回之前翻转它返回的值。
所以使用它可以做类似的事情:
var checkExisting = function (list, obj) {
return !list.every(function(elem) {
return elem.text !== obj;
});
}
如果对象没有属性文本等,显然你必须扩展它以进行错误处理。 见小提琴:http://jsfiddle.net/reLsqhkm/ 和文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/every