Object.assign但如果名称冲突则抛出错误

时间:2017-12-20 04:40:08

标签: javascript node.js

有没有办法使用Object.assign,以便在存在冲突的顶级属性时抛出错误?或者我们必须手动编写我们的功能吗?

3 个答案:

答案 0 :(得分:4)

  

有没有办法使用Object.assign,以便在顶级属性发生冲突时抛出错误?

没有。您所要求的不是Object.assign()的功能。

  

或者我们必须手动编写我们的功能吗?

是的,你必须自己写或找别人已经写过的东西。这里有一个不同的函数,如果任何顶级源属性与目标上已有的属性匹配,则抛出该函数。由于这不是Object.assign()的行为,因此这是一个具有不同名称的新函数似乎是合适的:

function mergeObjects(target, ...sources) {
    let originalProperties = new Set(Object.keys(target));
    // preflight for any top-level property name conflicts so we can throw before copying anything
    for (let src of sources) {
        for (let prop of Object.keys(src)) {
            if (originalProperties.has(prop)) {
                throw new Error(`target already has property ${prop}`);
            }
        }
    }
    return Object.assign(target, ...sources);
}

答案 1 :(得分:1)

let a = {1: '1', 2: '2', 3: '3'}

const pDummy = new Proxy(a, {
  set: function(target, prop, value, receiver) {
    if(target[prop] === undefined){
      target[prop] = value;
      // Reflect.set(target, prop, value);
      return true
    }
    else {
      throw new Error(`Already assigned property ${prop} `);
      // return false;
    }
  }
})

const test = Object.assign(pDummy, {4:'4', 5: '5'});
console.log('test', test);
const test1 = Object.assign(pDummy, {1:'4', 8: '5'});
console.log('test1', test1);

答案 2 :(得分:0)

您可以通过抛出错误的函数覆盖Object.assign。没有参数告诉Object.assign当前抛出错误。

numpy.seterr(all='raise')