代码之家  ›  专栏  ›  技术社区  ›  Sandeep Gupta

如何使用引用编辑对象的值?

  •  2
  • Sandeep Gupta  · 技术社区  · 6 年前

    我有一个大的物体阵列 persons

    persons = [{name:'john1'}, {name:'john2'},...]
    

    我迭代了数组,找到了我想要编辑的对象

    objectToEdit = persons .find((person)=>person.name==='john1')
    

    现在我用不变的方式创建了一个编辑过的对象( someOtherPerson = {name:'johnxx'} )

    objectFinal = {...objectToEdit, someOtherPerson}
    

    现在我想换这个 objectFinal 具有 objectToEdit 在里面 数组,而不必再次遍历数组。但是做 objectToEdit =objectFinal ,只将ObjectToEdited的引用分配给 对象编辑 ,不做任何更改 数组

    在不遍历数组的情况下,是否有一种干净的方法来实现这一点?

    编辑 :

    在这个例子中,persons中的对象jave只有一个键(即, name )这是为了使问题最小化。在我的项目中,我有30多把钥匙。

    4 回复  |  直到 6 年前
        1
  •  3
  •   mpm    6 年前

    如果要就地编辑列表中的对象,请使用array.prototype.some

    var persons = [{
      name: 'john1'
    }, {
      name: 'jack5'
    }]
    
    var someOtherPerson = {
    name: 'johnxx'
    }
    
    persons.some(function(person) {
      // if condition, edit and return true
      if (person.name === 'john1') {
        // use Object.keys to copy properties
        Object.keys(someOtherPerson).forEach(function(key) {
          person[key] = someOtherPerson[key]
        })
        // or use assign to merge 2 objects
        Object.assign(person, someOtherPerson);
        return true // stops iteration
      }
    })
    
    console.log(JSON.stringify(persons))
        2
  •  3
  •   CertainPerformance    6 年前

    如果要避免改变原始数组中的对象,可以使用 .findIndex 相反,在该索引处重新分配数组中的项:

    const persons = [{name:'john1'}, {name:'john2'}];
    const objectToEditIndex = persons.findIndex((person) => person.name === 'john1');
    const someOtherPerson = {name:"johnxx"};
    persons[objectToEditIndex] = {
      ...persons[objectToEditIndex],
      ...someOtherPerson
    };
    console.log(persons);
        3
  •  0
  •   Danon TylerDurden    6 年前

    执行此操作:

    objectFinal = {...objectToEdit, someOtherPerson}
    

    你失去了对原版的引用 objectToEdit 对象。要编辑它,您可以

    `objectToEdit.value = otherValue`.
    

    附言:这么说之后,你只会丢失对第一级对象的引用。如果该对象包含另一个对象或数组, 参考:

    objectFinal.innerObject.value = otherValue;
    
        4
  •  0
  •   KooiInc    6 年前

    姓名:'john1'应替换为姓名:“johnxx”人

    重新分配 persons -用新值映射的数组:

    let persons = [{name:'john1'}, {name:'john2'}];
    persons = persons.map( v => v.name === "john1" ? {name: "johnxx"} : v );
    console.log(persons);

    或者,如果你担心性能,使用 Array.splice Array.findIndex

    findindex方法每执行一次回调函数 数组索引0..数组中的长度-1(包含该长度),直到找到一个 其中callback返回一个truthy值(强制为true的值)。 如果找到这样的元素,findindex 立即 返回索引 对于那个迭代 .

    let persons = [{name:'john1'}, {name:'john2'}];
    persons.splice(persons.findIndex( v => v.name==="john1" ), 1, {name:'johnxx'});
    console.log(persons);

    或者使用实用程序方法(大数组(1000000个元素)的代码段和性能计时器)

    // replacer method
    const replace = (obj, [key, value], replacement) => {
       obj.splice(persons.findIndex( v => v[key] === value ), 1, replacement);
       return obj;
    }
    
    // create a large array (this may take some extra time)
    let persons = Array.from({length: 1000000}).map(v => 
      ({name: Math.floor(100000 + Math.random() * 1000000000).toString(16)}) );
    
    // pick an entry
    const someEntry = Math.floor(persons.length * Math.random());
    const entry = Object.entries(persons[someEntry])[0];
    
    console.log("before:", persons[someEntry]);
    const t = performance.now();
    
    // replacement call here
    console.log("after:", replace(persons, entry, {name: "johnxx"})[someEntry]);
    console.log("replacement took:", `${((performance.now() - t)/1000).toFixed(3)} sec`);