Получить индекс объекта в массиве в объекте в массиве
Работая с Impactjs, игровым движком, здесь и на уровнях есть очень странная настройка:
[
{
"entities": [
{"type":"type1","x":100,"y":100,"settings":{"directsTo":"-5"}},
{"type":"type2","x":101,"y":101,"settings":{"directsTo":"-4"}}
],
"layer": [
other data
]
}
]
Мне интересно, как получить индекс объекта type1 на основе свойства directsTo объекта настроек?
Javascript или JQuery будет в порядке.
Изменить: игра должна работать гладко на мобильном телефоне, поэтому эффективное решение хорошо.
4 ответа
Попробуй это,
var arr =[{
"entities": [{
"type": "type1",
"x": 100,"y": 100,
"settings": {"directsTo": "-5"}
}, {
"type": "type2",
"x": 101,"y": 101,
"settings": {"directsTo": "-4"}
}],
"layer": ['other data']
}];
var t='type1';
var newArr=arr[0];
for(var data in newArr){
for(a in newArr[data]){
if(newArr[data][a].type == t){
alert('Index of '+t+' is '+a+' in '+data);
}
}
}
Спасибо Рохан Кумар и Виктор Новиков.
var array =[
{
"entities": [
{
"type": "type1",
"x": 100,"y": 100,
"settings": {"directsTo": "-5"}
},
{
"type": "type2",
"x": 101,"y": 101,
"settings": {"directsTo": "-4"}
}
],
"layer": ['other data']
}
];
function getArrayIndexForLocationKey(arr, val) {
for(var i = 0; i < arr.length; i++){
if(arr[i].settings.directsTo == val)
return i;
}
return -1;
}
Можете ли вы использовать filter
имущество?
Предполагая, что ваш объект JS выглядит следующим образом
var j = [
{
"entities": [
{"type":"type1","x":100,"y":100,"settings":{"directsTo":"-5"}},
{"type":"type2","x":101,"y":101,"settings":{"directsTo":"-4"}}
],
"layer": [
"otherdata":{}
]
}
];
Вы можете найти объект, используя
var result = j[0].entities.filter(function(n) { return n.settings.directsTo == "-5"; });
// result[0].type == "type1"
Вы можете создать функцию, которая получает индекс объекта среди других объектов, например, так
//assuming you have the data parsed as a JSON object "data"
//and you also have your entity object as "obj"
function getIndex(obj, data){
return data.entities.indexOf(obj);
}
если у вас нет объекта "obj", вам нужно будет создать функцию, которая сначала найдет правильный объект на основе атрибута, например, параметра типа
function findEntity(type, source){
for(var i=0; i<source.entities.length; i++){
if(source.entities[i].type == type){
return source.entities[i];
}
}
return false;
}
теперь вы можете назвать это так
getIndex(findEntity("type1", data), data);
Надеюсь, это поможет вам начать!