2015-09-10 5 views
1

Я столкнулся с проблемой, которую я никогда раньше не видел в javascript. Вот суть того, что я делаюНевозможно добавить объект к другому объекту с картой

var doStuff = function(stuff, otherstuff){ 
    return _.map(stuff, function(s){ 

    // Thing needed is a fairly big object 
    var thingNeeded = _.find(otherstuff, function(os){ 
     return os.whatineed; 
    }); 

    var new_thing = _.clone(s); 
    new_thing.new_field = thingNeeded; 
    return new_thing; 
    }); 
}; 

Но это возвращает список, который оригинальный stuff список! Это происходит даже если я делаю это изменение

var doStuff = function(stuff, otherstuff){ 
    return _.map(stuff, function(s){ 

    // Thing needed is a fairly big object 
    var thingNeeded = _.find(otherstuff, function(os){ 
     return os.whatineed; 
    }); 


    s.new_field = thingNeeded; 
    return s; 
    }); 
}; 

или

var doStuff = function(stuff, otherstuff){ 
    return _.map(stuff, function(s){ 

    // Thing needed is a fairly big object 
    var thingNeeded = _.find(otherstuff, function(os){ 
     return os.whatineed; 
    }); 


    s['new_field'] = thingNeeded; 
    return s; 
    }); 
}; 

или вариации с использованием _.extend() и _.create(). Он также не работает с картой в прототипе массива.

Я понятия не имею, что я могу делать неправильно здесь. Он полностью игнорировал меня, добавляя поле. Может ли кто-нибудь помочь?

EDIT: для записи

[{thing: 1}, {thing: 2}].map(function(t){ 
    t.welp = 'welp'; 
}); 

вернется [{thing: 1, welp: 'welp'}, {thing: 2, welp: 'welp'}], как и ожидалось. Так что это где-то внутри карты.

EDIT СНОВА:

var doStuff = function(stuff, otherstuff){ 
    return _.map(stuff, function(s){ 

    // Thing needed is a fairly big object 
    var thingNeeded = _.find(otherstuff, function(os){ 
     return os.whatineed; 
    }); 

    var new_thing = _.clone(s); 
    new_thing.new_field = thingNeeded; 
    console.log('stuff:', new_thing.new_field); 
    return new_thing; 
    }); 
}; 

console.log возвратит значение, которое мы могли бы ожидать (thingNeeded).

Спасибо!

+0

Try клон, что нужно, а? –

+0

В последних двух случаях вы передаете «os» в обратный вызов «find», но затем используете «другое устройство» внутри. В первом случае, если «.whateded» не существует на «otherstuff», вы получите именно то, что видите. – caasjj

+0

@caasjj Спасибо за указание опечатки. – Steve

ответ

0

Я думаю, что вы используете материал в своем итераторе карты, когда вы должны использовать текущий итеративный объект 's'.

Вот рабочая скрипку http://jsfiddle.net/rzkvne23/

var doStuff = function(stuff, otherstuff){ 
    return _.map(stuff, function(s){ 

    var thingNeeded = _.find(otherstuff, function(os){ 
     return os.whatineed === 2; 
    }); 

    var new_thing = _.clone(s); 
    new_thing.new_field = thingNeeded; 
    console.log('stuff:', new_thing.new_field); 
    return new_thing; 
    }); 
}; 

var a = [{},{},{}]; 
var b = [{whatineed: 1},{whatineed:2},{whatineed:3}]; 

console.dir(doStuff(a,b)); 
+0

это никогда не будет разрешено. Вы нашли еще одну опечатку. Прости. В реальном коде я клонирую схожую с другими примерами, где я использую s. Я собираюсь просто отказаться от этого и сделать что-то еще. Я ненавижу javascript именно по этой причине. – Steve

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