我有一个数组
vendors = [{
Name: 'Magenic',
ID: 'ABC'
},
{
Name: 'Microsoft',
ID: 'DEF'
} // and so on...
];
我如何检查这个数组,看看“Magenic”是否存在?我不想循环,除非迫不得已。我可能要处理几千条记录。
我有一个数组
vendors = [{
Name: 'Magenic',
ID: 'ABC'
},
{
Name: 'Microsoft',
ID: 'DEF'
} // and so on...
];
我如何检查这个数组,看看“Magenic”是否存在?我不想循环,除非迫不得已。我可能要处理几千条记录。
当前回答
Var without2 = (arr, args) => arr。过滤(v => v.id !== args.id); 例子:
without2 ([{id: 1}, {id: 1}, {id: 2}), {id: 2})
结果: without2 ([{id: 1}, {id: 1}, {id: 2}), {id: 2})
其他回答
除非你想这样重组:
vendors = {
Magenic: {
Name: 'Magenic',
ID: 'ABC'
},
Microsoft: {
Name: 'Microsoft',
ID: 'DEF'
} and so on...
};
你可以这样做如果(vendor . magnetic)
你必须循环
不需要循环。我想到了三种方法:
Array.prototype.some ()
这是对你的问题最准确的回答。"check if something exists",表示bool类型的结果。如果有任何“Magenic”物体,这将是正确的,否则为假:
let hasMagenicVendor = vendors.some( vendor => vendor['Name'] === 'Magenic' )
Array.prototype.filter ()
这将返回一个包含所有“Magenic”对象的数组,即使只有一个(将返回一个单元素数组):
let magenicVendors = vendors.filter( vendor => vendor['Name'] === 'Magenic' )
如果你试图将其强制为布尔值,它将不起作用,因为空数组(没有'Magenic'对象)仍然为真。所以使用魔法供应商。条件句中的长度。
Array.prototype.find ()
这将返回第一个“Magenic”对象(如果没有,则未定义):
let magenicVendor = vendors.find( vendor => vendor['Name'] === 'Magenic' );
这将强制转换为布尔值(任何对象为真,未定义为假)。
注意:我使用vendor[“名称”]而不是vendor。名称,因为属性名的大小写很奇怪。
注意2:在检查名称时,没有理由使用松散相等(==)而不是严格相等(===)。
你可以使用lodash。如果lodash库对你的应用程序来说太沉重,可以考虑将不需要的不使用的函数分块。
let newArray = filter(_this.props.ArrayOne, function(item) {
return find(_this.props.ArrayTwo, {"speciesId": item.speciesId});
});
这只是一种方法。另一个可以是:
var newArray= [];
_.filter(ArrayOne, function(item) {
return AllSpecies.forEach(function(cItem){
if (cItem.speciesId == item.speciesId){
newArray.push(item);
}
})
});
console.log (arr);
上面的例子也可以在不使用任何库的情况下重写,比如:
var newArray= [];
ArrayOne.filter(function(item) {
return ArrayTwo.forEach(function(cItem){
if (cItem.speciesId == item.speciesId){
newArray.push(item);
}
})
});
console.log(arr);
希望我的回答能有所帮助。
2018编辑:这个答案来自2011年,当时浏览器还没有广泛支持数组过滤方法和箭头函数。来看看CAFxX的答案吧。
没有“神奇”的方法可以在没有循环的情况下检查数组中的内容。即使你使用某个函数,这个函数本身也会使用循环。您可以做的是,一旦找到要查找的内容,就立即跳出循环,以最小化计算时间。
var found = false;
for(var i = 0; i < vendors.length; i++) {
if (vendors[i].Name == 'Magenic') {
found = true;
break;
}
}
因为OP询问了密钥是否存在的问题。
使用ES6 reduce函数返回布尔值的更优雅的解决方案可以是
const magenicVendorExists = vendors.reduce((accumulator, vendor) => (accumulator||vendor.Name === "Magenic"), false);
注意:reduce的初始参数是false,如果数组有键,它将返回true。
希望它有助于更好和更清晰的代码实现