2016-08-17 3 views
3

У меня есть опыт только с массивами JS, а не с объектами, поэтому я пытаюсь научиться их перемещаться. Я был бы признателен за любые ответы с хорошим объяснением, которые показывают процесс выполнения следующей задачи:Итерация через объект, чтобы найти соответствие для двух переменных ID

У меня есть месяц (выраженный как целое число, 1-11) и набор данных для различных идентификаторов (также как целое число , например, 474)

данные выглядит следующим образом (подмножество некоторых более длинных данных):

var myData = { 
    1: {474: true, 459: true}, 
    4: {474: true, 578: true, 987: true, 459: true, 917: true, 296: true}, 
    5: {474: true, 578: true, 1036: true, 391: true, 987: true, 459: true, 917: true, 296: true} 
}; 

Мне нужно

а) Найдите первый ключ в мой индекс, основанный на мой month значение. Например, var month = 4;

б) Найдите ли истинным или ложным для моего ID значения в этом подобъектов, например var ID = 917

Некоторые примеры того, что мне нужно проверить:

если month == 1 и ID == 459 возвращение true

если month == 1 и ID == 917 возвращение false (917 нет в данных за месяц 1

если month == 4 и ID == 987 возвращения true

если month == 5 и ID == 917 возвращение true

если month == 5 и ID == 100 возвращение false (100 нет в данных для month 5)

Я защитил, что все месяцы 1-11 являются присутствуют в данных, поэтому мне не нужно иметь дополнительную проверку, чтобы увидеть, есть лиВ объекте существует значение. Просто нужно найти первый ключ, используя month, а затем выполнить поиск в этом под-объекте для ID, и если он найдет его обратно true.

+1

'если (MyData [месяц] [ID]) {/ * делаем что-то * /}' - Нет итерации или поиска необходимо просто проверить свойства непосредственно. – nnnnnn

+0

'' Ему просто нужно найти первый ключ «' может быть только один ключ, который является «месяцем», чтобы быть точным здесь, если мы говорим об обучении. Что касается вопроса, просто обращайтесь к ним и защищайте их от «неопределенных» значений, и вам хорошо идти. – Dellirium

ответ

2

Как вы уже знали, что синтаксис { } определяет объект в JavaScript.

Объекты всегда структурированы парой ключ/значение, где ключ должен быть уникальным значением, а значение может быть любым. Например. другой объект, цифры.

Для доступа к значению объекта с помощью ключа, который вы обычно будете делать myData.5 это вернет вам вложенный объект {474: true, 578: true, 1036: true, 391: true, 987: true, 459: true, 917: true, 296: true}

Но вы используете только точечную нотацию, если вы можете Preemptive то, что вы хотите заранее, например, ключ 1 из объект. В определенном сценарии, где вы не уверены, какие ключи вы будете получать. Например. после некоторой обработки данных и алгоритм мог получить доступ к значению от ключа 3, а иногда и от ключа 1, то для таких случаев вы делаете myData["5"]. Где "5" Строковое значение обычно является переменной. Это значит, что вы можете динамически обращаться к ключу, основанному на значении переменной.

Для вашего случая; если вы хотите просто проверить, существует ли ключ для определенного месяца, а затем просто сделать;

myData[month][ID] Если эта проверка вернет true, то мы знаем, что месяц имеет этот ключ. В противном случае.

var myData = { 
 
    1: {474: true, 459: true}, 
 
    4: {474: true, 578: true, 987: true, 459: true, 917: true, 296: true}, 
 
    5: {474: true, 578: true, 1036: true, 391: true, 987: true, 459: true, 917: true, 296: true} 
 
}; 
 

 
if (myData[1][474]) { 
 
    console.log("key 474 exists in month 1."); 
 
} 
 
if (myData[1][974]) { 
 
    console.log("key 974 exists in month 1."); 
 
} 
 
else { 
 
    console.log("Key 974 doesn't exists for month 1."); 
 
}

+0

@ пользователь1486133 надеюсь, что описание объекта поможет. –

+0

Это самый жизнеспособный ответ – Dellirium

+0

Спасибо за дополнение = –

2

Вы можете просто сделать

!!myData[month][ID] 

так, что она превратится в неопределенной ложь, и правда будет оставаться верным

+0

Хотя это правильный ответ, если она должна искать что-то другое, то true/false, это не сработает, и с самого начала вопрос: «Я пытаюсь узнать, как работают объекты». Я считаю, что это не надлежащий способ обращения с ним. – Dellirium

2

Вы можете использовать проверку и привести результат к булеву.

function check(month, id) { 
 
    return !!(myData[month] && myData[month][id]); 
 
} 
 

 
var myData = { 1: { 474: true, 459: true }, 4: { 474: true, 578: true, 987: true, 459: true, 917: true, 296: true }, 5: { 474: true, 578: true, 1036: true, 391: true, 987: true, 459: true, 917: true, 296: true } }; 
 

 
console.log(check(1, 459)); // true 
 
console.log(check(1, 917)); // false (917 not present in data for month 1 
 
console.log(check(4, 987)); // true 
 
console.log(check(5, 917)); // true 
 
console.log(check(5, 100)); // false (100 not present in data for month 5) 
 
console.log(check(0, 100)); // false (no data present for month 0)

0

Входные данные:

var myData = { 
    1: {474: true, 459: true}, 
    4: {474: true, 578: true, 987: true, 459: true, 917: true, 296: true}, 
    5: {474: true, 578: true, 1036: true, 391: true, 987: true, 459: true, 917: true, 296: true} 
}; 

а) Найдите первый ключ в мой индекс, основанный на моем месяц значения. Например, var month = 4;

  • Вы бы просто сделать это, myData["4"], это вернет {474: true, 578: true, 987: true, 459: true, 917: true, 296: true}

  • Давайте это в переменной, как этот var subObject = myData["4"];

б) Найдите ли true или false для моего значения ID в этом под-объекте, например var ID = 917

  • Вы можете сделать то же самое еще раз, subObject["917"], это вернет true.

  • Если subObject не имеет идентификатора, значит оно вернет undefined.

  • Возможно, возвращенные значения могут быть true, false or undefined.

  • Возьмем это также в переменной, var value = subObject["917"]. Чтобы всегда получать логическое значение, мы можем использовать двойное отрицание, например, это !!value. Это позволит сделать undefined, null, false and empty string быть возвращены как false в то время как истинный остается true

Короче говоря, как это было предложено Дэйв, мы можем избавиться от переменных и записать его в одну линию, как !!myData[month][ID].

Однако учтите, что если myData[month] - undefined, то myData[month][ID] выдает ошибку, поэтому ее всегда разумно проверить в if-состоянии. Проверьте этот вопрос для получения дополнительной информации Checking if a key exists in a JavaScript object?

if(("4" in myData) && ("917" in myData["4"])){ 
    return myData["4"]["917"]; 
} 
Смежные вопросы