我有一个数组

vendors = [{
    Name: 'Magenic',
    ID: 'ABC'
  },
  {
    Name: 'Microsoft',
    ID: 'DEF'
  } // and so on... 
];

我如何检查这个数组,看看“Magenic”是否存在?我不想循环,除非迫不得已。我可能要处理几千条记录。


当前回答

你必须循环,这是没有办法的。

function seekVendor(vendors, name) {
  for (var i=0, l=vendors.length; i<l; i++) {
    if (typeof vendors[i] == "object" && vendors[i].Name === name) {
      return vendors[i];
    }
  }
}

当然,你可以使用像linq.js这样的库来让它更令人满意:

Enumerable.From(vendors).Where("$.Name == 'Magenic'").First();

(参见jsFiddle的演示)

我怀疑linq.js会比直接的循环更快,但当事情变得有点复杂时,它肯定会更灵活。

其他回答

这里的许多答案都很好,也很简单。但如果你的对象数组有一个固定的值集,那么你可以使用下面的技巧:

映射一个对象中的所有名称。

vendors = [
    {
      Name: 'Magenic',
      ID: 'ABC'
     },
    {
      Name: 'Microsoft',
      ID: 'DEF'
    }
];

var dirtyObj = {}
for(var count=0;count<vendors.length;count++){
   dirtyObj[vendors[count].Name] = true //or assign which gives you true.
}

现在这个dirtyObj你可以一次又一次地使用,没有任何循环。

if(dirtyObj[vendor.Name]){
  console.log("Hey! I am available.");
}

为了比较一个对象和另一个对象,我结合了for in循环(用于遍历对象)和some()。 你不必担心数组越界等问题,这样可以节省一些代码。一些文档可以在这里找到

var productList = [{id: 'text3'}, {id: 'text2'}, {id: 'text4', product: 'Shampoo'}]; // Example of selected products
var theDatabaseList = [{id: 'text1'}, {id: 'text2'},{id: 'text3'},{id:'text4', product: 'shampoo'}];    
var  objectsFound = [];

for(let objectNumber in productList){
    var currentId = productList[objectNumber].id;   
    if (theDatabaseList.some(obj => obj.id === currentId)) {
        // Do what you need to do with the matching value here
        objectsFound.push(currentId);
    }
}
console.log(objectsFound);

我比较一个对象和另一个对象的另一种方法是使用object .keys()的嵌套for循环。长度来获取数组中对象的数量。下面的代码:

var productList = [{id: 'text3'}, {id: 'text2'}, {id: 'text4', product: 'Shampoo'}]; // Example of selected products
var theDatabaseList = [{id: 'text1'}, {id: 'text2'},{id: 'text3'},{id:'text4', product: 'shampoo'}];    
var objectsFound = [];

for(var i = 0; i < Object.keys(productList).length; i++){
        for(var j = 0; j < Object.keys(theDatabaseList).length; j++){
        if(productList[i].id === theDatabaseList[j].id){
            objectsFound.push(productList[i].id);
        }       
    }
}
console.log(objectsFound);

为了回答你的确切问题,如果你只是在一个对象中搜索一个值,你可以使用一个for in循环。

var vendors = [
    {
      Name: 'Magenic',
      ID: 'ABC'
     },
    {
      Name: 'Microsoft',
      ID: 'DEF'
    } 
];

for(var ojectNumbers in vendors){
    if(vendors[ojectNumbers].Name === 'Magenic'){
        console.log('object contains Magenic');
    }
}

目前最简单的方法:

if (vendors.findIndex(item => item.Name == "Magenic") == -1) {
  //not found item
} else {
  //found item 
}

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:   'ABC',
    Microsoft: 'DEF'
};

然后你就可以像使用查找哈希一样使用它。

vendors['Microsoft']; // 'DEF'
vendors['Apple']; // undefined