【问题标题】:lodash javascript object assign only with same keylodash javascript对象仅使用相同的键分配
【发布时间】:2017-04-04 02:21:12
【问题描述】:
const _ = require('lodash');
const tst = {
  a: 'A',
  b: 'B',
  c: 'C',
  d: 'D',
  e: {
    f: 'F',
    g: 'G'
  }
};

const tst2 = {
  e: {
    f: 'FF'
  },

  c: 'CC',

  h: 'HH'
}

console.log(_.assign(tst, tst2));
// { a: 'A', b: 'B', c: 'CC', d: 'D', e: { f: 'FF' }, h: 'HH' }
Object.assign(tst, tst2);
console.log(tst); // same with above result.
console.log(_.merge(tst, tst2));
// { a: 'A', b: 'B', c: 'CC', d: 'D', e: { f: 'FF', g: 'G' }, h: 'HH' }

我怎样才能得到结果

{ a: 'A', b: 'B', c: 'CC', d: 'D', e: { f: 'FF', g: 'G' } } ?

这意味着,我想获取更新的 tst 对象。仅 tst 当前键。 assign 方法不仅存在深拷贝问题,而且还存在不必要的 key (h) 问题。 合并方法看起来很合适,但包含了不必要的键(h 键)。 我现在可以使用我制作的其他附加方法来处理这个问题。

我想知道我错过了在函数调用中使用一个内置(lodash 或 es6)实现的函数,例如

console.log(someFunction(tst, tst2));
// { a: 'A', b: 'B', c: 'CC', d: 'D', e: { f: 'FF', g: 'G' } }

【问题讨论】:

  • 不,不行。它仍然打印'h'键我不想要'h'键
  • 荒谬的感叹号,没有显示你通过一种 lodash 方法尝试过的内容,并说你不想在没有解释的情况下使用任何附加功能是什么让我这个问题质量太低保持开放。也许你可以解决其中的一些问题。
  • 嗯,好的,我会解决的

标签: javascript ecmascript-6 lodash


【解决方案1】:

我认为这是您将获得的最接近的原生解决方案,它不会对“c”键进行特殊处理:

function updateKeyIfDifferentValue(obj, src) {
    Object.keys(obj).forEach(function(key) {
      if (src.hasOwnProperty(key)) {
        obj[key] = src[key];
      } else {
        obj[key] = obj[key];
      }
    });
    return obj;
}

let tst = {
  a: 'A',
  b: 'B',
  c: 'C',
  d: 'D',
  e: {
    f: 'F',
    g: 'G'
  }
};

let tst2 = {
  e: {
    f: 'FF'
  },
  c: 'CC',
  h: 'HH'
}

updateKeyIfDifferentValue(tst.e, tst2.e);
Object.assign(tst2, tst);
console.log(tst); // { a: "A", b: "B", c: "C", d: "D", e: {f: "FF", g: "G"} }

【讨论】:

  • 是的,没有一个功能解决方案。谢谢
【解决方案2】:

您可以使用merge

var result = _.merge(tst, tst2);

var tst = {
  a: 'A',
  b: 'B',
  c: 'C',
  d: 'D',
  e: {
    f: 'F',
    g: 'G'
  }
};

var tst2 = {
  e: {
    f: 'FF'
  },

  c: 'CC',

  h: 'HH'
};

var result = _.merge(tst, tst2);

console.log(result);
body > div { min-height: 100%; top: 0; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>

【讨论】:

  • 不工作它仍然有'h'键。我不想要 h 键这是 _.merge(tst, tst2); 的结果{ a: 'A', b: 'B', c: 'CC', d: 'D', e: { f: 'FF', g: 'G' }, h: 'HH' }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多