/ / Підкресли JS об’єкт розширення з ненульовими значеннями з нового об’єкта - javascript, underscore.js, extension

Підкреслення JS розширює об'єкт з ненульовими значеннями з нового об'єкта - javascript, underscore.js, розширюється

Я хотів би зробити щось на кшталт ...

_.extend(original, fresh);

Але тільки для копіювання над атрибутами, які не є нульовими, тому ...

var original = {a:1, b:2, c:3}
var fresh = {a:5, b:null}

var mixed = _.extend(original, fresh)
// currently mixed is {a:5,b:null,c:3}
// I want it to be {a:5,b:2,c:3}

Оновлення

Я досяг певного прогресу, але це не працює з вкладеними об'єктами ...

http://jsfiddle.net/billymoon/2GwMx/1/

var original = {a:1, b:2, c:3, d:{g:1}}
var fresh = {a:5, b:null,c:"", d:{e:4,f:5,g:null}}

var mixed = _.extend( original, _.reduce(fresh,function(a,v,k){
if(v){ a[k]=v; }
return a;
}, {}) )

// currently mixed is {"a":5,"b":2,"c":3,"d":{"e":4,"f":5,"g":null}}
// I want it to be {"a":5,"b":2,"c":3,"d":{"e":4,"f":5,g:1}}
alert(JSON.stringify(mixed))

Відповіді:

2 для відповіді № 1

Дотик javascript з тиском підкреслення:

_.mixin({
extendNonNull: function(obj) {
_.each(_.rest(arguments,1), function(source) {
if (source) {
for (var prop in source) {
if( _.isObject(source[prop]) && _.isObject(obj[prop])){
obj[prop] = _.extendNonNull(obj[prop], source[prop]);
}
else if( !_.isNull(source[prop])){
obj[prop] = source[prop];
}
}
}
});
return obj;
}
});

var original = {a:1, b:2, c:3, d:{g:1}};
var fresh = {a:5, b:null,c:"", d:{e:4,f:5,g:null}};

var mixed = _.extendNonNull(original, fresh);

0 для відповіді № 2

якщо ви використовуєте lodash або підкреслення, це можна зробити так:

import _ from "lodash";
let result = _.merge({},target, source);
let clonedNonNull = _.omit(result,_.isNull);

0 для відповіді № 3

Використовуючи Lodash, ви можете передавати функцію фільтра як останній параметр призначити З функція
Потім ви можете фільтрувати нуль значення або більш конкретні випадки і об'єднують більше 2 об'єктів одночасно.

let obj1 = {a: "foo", b: null}
let obj2 = {a: null, b: "bar"}

// acc is the accumulator value
function filter(acc, newValue) {
let isNull = _.isNull(newValue);
return isNull ? acc : newValue;
}

let mixin = _.assignWith({}, obj1, obj2, filter); // {a: "foo", b: "bar"}