通过数组中的一个字段获取对象

Get an object in array by one of its fields

本文关键字:一个 字段 获取 取对象 数组      更新时间:2023-09-26

对不起,我是JS的新手;我有一个对象数组;我怎样才能得到键为"user_key3"的对象的名称,而且显然没有循环和条件。

arr = [{
        "name": "user1",
        "key": "user_key1"
},{
        "name": "user3",
        "key": "user_key3"
},{
        "name": "user2",
        "key": "user_key2"
}]

如果你需要更多的说明,请告诉我

谢谢

你可以用函数式的方式来做,像这样

var name;
arr.forEach(function(currentObject) {
    if (currentObject.key === "user_key3") {
        name = currentObject.name;
    }
});

如果你想在第一次匹配时短路,你可以使用Array.prototype.some,像这样

var name;
arr.some(function(currentObject) {
    if (currentObject.key === "user_key3") {
        name = currentObject.name;
        return true;
    }
    return false;
});

OP提到的显然没有循环,没有条件。我将这样做:

arr = [{
    "name": "user1",
    "key": "user_key1"
},{
    "name": "user3",
    "key": "user_key3"
},{
    "name": "user2",
    "key": "user_key2"
}];
var keyValMap = arr.map(function(n) { return n.key } );
var arrIndex = keyValMap.indexOf('user_key3');
alert(arr[arrIndex].name);

小提琴

您必须迭代并检查键

var user_name;
for (var i=0; i<arr.length; i++) {
    if ( arr[i].key === 'user_key3' ) {
        user_name = arr[i].name;
        break;
    }
}

小提琴

你已经编辑了这个问题,包括

显然没有循环和条件

但是循环和条件是目前为止最有效和跨浏览器的方式,所以为什么你"显然"不想要这个呢?

一个低效但简洁的解决方案是

var keyarr = arr.map(function(x) { return x.key } );
//keyarr is list of keys
var index=keyarr.indexOf("user_key3");
//arr[index] is your answer. Index will be -1 if the key doesn't exist

通常,在数组中查找满足任意属性的项需要遍历数组:

function find(arr, name) {
  for (var i=0; i<arr.length; i++) {
    if ( arr[i].key === name ) {
      return arr[i];
    }
  }
}

然后找到它,

var obj = find(arr, 'user_key3');

使用更实用的解决方案来查找项目也不错,但最终还是会以某种方式循环。

但是,如果您按键进行查找,那么键值对数组并不是最好的数据结构。我建议直接使用对象:

var map = {
  'user_key1': 'user1',
  'user_key2': 'user2',
  'user_key3': 'user3'
}

则查找简单:

map['user_key3'];

试试这个- underscore.js

For Your Example -

_.where(arr, {key: "user_key3"});

Javascript中的object不能这样做。虽然这里有回调和循环的组合:

arr = [{
        "name": "user1",
        "key": "user_key1"
  },{
        "name": "user3",
        "key": "user_key3"
},{
        "name": "user2",
        "key": "user_key2"
}];
arr.forEach(function(elme){
   for(var g in elme)
   {  
     if(elme[g] == 'user_key3') 
     {
       console.log("Found the value: "+g+" : "+elme[g]);
     };
   }
});