Получить индекс объекта в массиве в объекте в массиве

Работая с 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);
        }
    }
}

Live Demo

Обновленная демоверсия

Спасибо Рохан Кумар и Виктор Новиков.

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

Надеюсь, это поможет вам начать!

Другие вопросы по тегам