2016-06-11 2 views
0

У меня этот код:Невозможно установить свойство '01' неопределенной

var _ = require('underscore'); 

var myObj = [ 

    {'name': 'Mike', 'number' : 'b1' , 'level' : 0 }, 
    {'name': 'Tom', 'number' : 'b2' , 'level' : 0 } 
]; 

var result = _.map(myObj, _.invert); 

Теперь, результат:

[ { '0': 'level', Mike: 'name', b1: 'number' }, 
    { '0': 'level', Tom: 'name', b2: 'number' } ] 

Ok, пока здесь.

Затем я добавляю в результате некоторые части и пытаются заполнить их:

result = result, 
    parts = {'levels': {}, 'names': {}, 'numbers': {}}; 

result.forEach(function(obj,i){ 

    Object.keys(obj).forEach(function(k) { 

     parts[k +"s"][k +(i+1)] = obj[k]; 
    }); 
}); 

, но я получаю:

TypeError: Cannot set property '01' of undefined 

на parts[k +"s"][k +(i+1)] = obj[k];

Сразу отметим, что если я не использую invert, код запускается без проблем.

+2

Очевидно 'частей [K + "S"]' не определено. Не знаете, почему вы думали иначе, а не то, что вы пытаетесь сделать. – Oriol

+0

'parts [k +" s "] [k + (i + 1)] = obj [k];' => 'parts [k +" s "] = parts [k +" s "] || {} [k + "s"] [k + (i + 1)] = obj [k]; ' –

+0

Почему вы вообще используете' _.inverse'? Если вы инвертируете ключ и значения, то вам обязательно нужно _inverse_ 'k' и' obj [k] 'также:' parts [obj [k] + "s"] [obj [k] + (i + 1) ] = k; ' –

ответ

1

Вы можете изменить это:

result.forEach(function(obj,i){ 
    Object.keys(obj).forEach(function(k) { 
     parts[k +"s"][k +(i+1)] = obj[k]; 
    }); 
}); 

к этому:

result.forEach(function(obj, i){ 
    Object.keys(obj).forEach(function(k) { 
     let box = parts[obj[k] + 's'][k]; 
     if(box) { 
      if(Array.isArray(box)) { 
       box.push(obj[k] + (i + 1)); 
      } else { 
       parts[obj[k] + 's'][k] = [box, parts[obj[k] + 's'][k].slice(0, -1) + (i + 1)]; 
      } 
      return; 
     } 

     parts[obj[k] + 's'][k] = obj[k] + (i + 1); 
    }); 
}); 
+0

: '[k + (i + 1)]' потому, что я увеличиваю, например, имена, чтобы иметь '' имена ": { " name1 ":" Mike ", " name2 ":" Tom " }, '(Я говорю перед использованием инвертирования). Теперь я просто хочу иметь противоположное' («Mike»: «name1», «Tom»: «name2») ' – George

+0

@George Посмотрите на это (обновлено). Это дает странные результаты для 'levels', потому что у вас есть 2 ключа, равных' 0', поэтому в 'parts.levels' вы просто имеете 1 ключ' 0'. Но, видимо, это то, чего вы хотели. Возможно, вам захочется выбрать другой способ хранения данных, поскольку в некоторых случаях он дублируется. – Azamantes

+0

: Хмм.Очень хорошо! Единственное, что, поскольку 'level' filed имеет значение' 0' два раза, оно появляется '' levels ': { «0»: «level2» }, '.Is there способ выглядеть примерно так: '" levels ": { " 0 ": {" level1 "," level2 "} },'? – George

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