2014-08-04 4 views
3

Извините, что я новичок в JS; У меня есть массив объектов; как я могу получить имя объекта с ключом «user_key3» и, очевидно, без цикла и условия.Получить объект в массиве одним из полей

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

Пожалуйста, дайте мне знать, если вам нужно больше разъяснений

Благодарности

+0

Я дал тот же ответ, как принято один задолго до того, что ответ был отправлен. Любая причина игнорировать мой ответ? – ma08

ответ

1

неэффективных еще краткое решение будет

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 
+0

@pasargad - вам нужно имя объекта, в то время как это решение дает вам только местоположение – Rajesh

2

Вам придется перебирать и проверить для ключа

var user_name; 

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

FIDDLE

You» ve отредактировал вопрос, чтобы включить

, очевидно, не имея петлю и есть условие

, но цикл и состояние на сегодняшний день является наиболее эффективным и кросс-браузер способ сделать это, так почему бы вам «явно» не хотят это ?

2

Вы можете сделать это функциональный способом, как это

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; 
}); 
1

В общем, найти элемент, который удовлетворяет эс некоторое произвольное свойство в массиве требует, чтобы вы цикла по массиву:

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']; 
1

Попробуйте это - underscore.js

Для примера -

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

Это не внутренне javascript. Это похоже на создание цикла в пользовательской функции, а затем использование и вызов этой функции ... –

+0

Да, это правда. – Vintesh

1

Вы не можете сделать такие с объектами в Javascript.Хотя здесь у вас есть сочетание обратных вызовов и петли:

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]); 
    }; 
    } 
}); 
2

ОП упомянул , очевидно, не имея петлю и есть условие. Я хотел бы сделать это, как показано ниже:

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); 

Fiddle

Смежные вопросы