【问题标题】:Best way to create a NEW and DIFFERENT Object from another object从另一个对象创建一个新的和不同的对象的最佳方法
【发布时间】:2019-07-19 07:31:57
【问题描述】:

我希望能够接受一个对象

const objectOriginal = {
  nestedObject: {
   someValue: 1
  }
}

从上面创建一个新对象并将其值更改为

const newObject = {
  nestedObject: {
   someValue: 33
  }
}

我有一个嵌套对象的大型对象作为我的原始对象,我想基于这个原始对象创建一个新对象。问题是我需要这两个对象不同,而不是来自同一个原型链。

为了解决这个问题,我创建了一个函数,将第一个对象转换为数组,过滤掉我需要更改的对象,更改值,推送到数组,然后创建一个新对象。

const originalObject = {
  nested1: {
    id: "nested1"
    value: 1
  },
  nested2: {
    id: "nested2"
    value: 2
  },
  nested3: {
    id: "nested3"
    value: 3
  }
}

const valueToChange = "nested1"

const createNewObject = (originalObject, valueToChange) => { 
  const originalObjectToArray = Object.values(originalObject)

  const temporaryArray = originalObjectToArray.filter(object => object.id !== valueToChange)

  const newNestedObject = {
    id: valueToChange,
    value: 33
  }
  temporaryArray.push(newNestedObject)

  const newAndDifferentObject = {}
  for (let obj of temporaryArray) {
    newAndDifferentObject[obj.id] = obj
  }
  return newAndDifferentObject
}

这个方案行得通,但我觉得一定有更好的方法来实现这个?如果我想创建一个新的和不同的对象,我不应该(至少我不希望)将它更改为一个数组,只是为了将其更改回一个对象。任何建议将不胜感激。

【问题讨论】:

标签: javascript node.js object prototype


【解决方案1】:

我将为此使用 Object.assign()。我们创建一个新的空对象,分配原始对象的所有原始属性,然后分配新的嵌套对象。该方法将负责用新属性替换现有属性(在此处阅读更多:Merging Objects With Same Properties)。

const originalObject = {
  nested1: {id: "nested1", value: 1},
  nested2: {id: "nested2", value: 2},
  nested3: {id: "nested3", value: 3}
};

const createNewObject = (originalObj, valToChange, newVal) =>
{
    const newObj = {id: valToChange, value: newVal};
    return Object.assign({}, originalObj, {[valToChange]: newObj});
};

// Example of replacements.
console.log(createNewObject(originalObject, "nested1", 33));
console.log(createNewObject(originalObject, "nested2", 99));

// Example of a new property (none of the original are replaced)
console.log(createNewObject(originalObject, "nested4", 44));

您甚至可以将之前的方法概括为接受 [valToChange, newVal] 类型的对数组,以创建具有多项更改的新 object

const originalObject = {
  nested1: {id: "nested1", value: 1},
  nested2: {id: "nested2", value: 2},
  nested3: {id: "nested3", value: 3}
};

const createNewObject = (originalObj, updateList) =>
{
    let newObjs = updateList.reduce((acc, [k, v]) =>
    {
        acc[k] = {id: k, value: v};
        return acc;
    }, {});

    return Object.assign({}, originalObj, newObjs);
};

console.log(createNewObject(
    originalObject,
    [["nested1", 33], ["nested2", 99], ["nested4", 44]]
));

【讨论】:

    【解决方案2】:

    您的问题是两个变量都指向同一个对象(浅拷贝)。你正在做的是一个深拷贝,还有一种更简单的方法是使用 JSON:

    function jsonCopy(src) {
        return JSON.parse(JSON.stringify(src));
    }
    

    将您的原始对象作为 src 传递,它将其转换为 JSON 字符串并将其解析回对象,执行对象的深层复制并返回它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-23
      • 1970-01-01
      • 1970-01-01
      • 2018-07-16
      • 1970-01-01
      • 2014-07-14
      • 2016-03-07
      • 1970-01-01
      相关资源
      最近更新 更多