2015-04-22 12 views
5

Próbuję wykonać scalanie obiektów z lodash w node.js. Scalanie działa świetnie w tym, że nie zastąpi obiektów właściwości, które powodują niezdefiniowanie.wewnętrzne jak scalić w lodas

Jednak chciałbym, aby środki do niego tylko nadpisywać obiekty, które istnieją w obiekcie docelowym. Zobacz poniższy przykład:

var e1 = { 
    name: 'Jack', 
    surname: 'Root' 
}; 

połączyć z

var e2 = { 
    name: 'Rex', 
    surname: undefined, 
    age: 24 
}; 

Aktualny wynik:

{ 
    name: 'Rex', 
    surname: 'Root', 
    age: 24 
} 

wynik Chciałbym:

{ 
name: 'Rex', 
surname: 'Root' 
} 

Więc co próbuję dostać się dla obiektu źródłowego, aby tylko nadpisać propert które istnieją w obu i tylko wtedy, gdy nie są niezdefiniowane.

Próbowałem szukając innych funkcji, ale tylko znaleźć scalić i przypisać robić podobne rzeczy. Ale niestety nie jest to dokładnie to, czego chciałem.

Cały pomysł polega na zbudowaniu pewnej metody, która spowoduje pobranie pól obiektów z formularza internetowego, a następnie powiązanie ich z obiektem modelu mongoose.js, który będzie się utrzymywał.

Ma to na celu uniknięcie konieczności ręcznego wiązania każdej właściwości z innym obiektem.

Odpowiedz

3

nie mogłem zorientować się bardzo wygodny sposób, aby to zrobić za pomocą metod lodash, ale nie jest to zbyt trudne do zrobienia za pomocą wanilię:

// Only loop over e1 values 
for (var e1k in e1) { 
    // Use e2 value if it exists, otherwise stick with what is already there 
    e1[e1k] = e2[e1k] || e1[e1k]; 
} 
+0

Bardzo ładne !! Prosty i skuteczny. Można również ponownie to uwzględnić, aby nawet przejść do właściwości podrzędnych. –

3

Można użyć _.mapValues:

var e1 = { 
    name: 'Jack', 
    surname: 'Root' 
}; 
var e2 = { 
    name: 'Rex', 
    surname: undefined, 
    age: 24 
}; 

var result = _.mapValues(e1, function (n, e) { 
    return e2[e] || n; 
}); 
console.log(result); 
+0

Awesome. Ta odpowiedź jest równie dobra. Dzięki. –