如何指定对象中项目的位置

时间:2017-04-05 06:56:41

标签: javascript javascript-objects

假设我有一个像这样的对象用户。

  const user =  {
    nationality: 'Italian',
    age: 24,
    name: {
      firstName: 'rocky',
      lastName: 'balboa',
    },
  };

我更新了firstName中的name项。我想将此更改传达给某个函数,因此它也可以使用相同的结构更新它自己的用户对象中的firstName。最好的方法是什么?

根据我的理解,要指定firstName,我们将使用user[name][firstName]。但是我如何将它发送到另一个对象,让我们说primeUsers所以它也可以更新自己?

  const primeUser =  {
    nationality: 'Italian',
    age: 24,
    name: {
      firstName: 'rocky',
      lastName: 'balboa',
    },
  };

一种方法是发送“级别”数组。所以我会发送一个数组

const levels = ["name", "firstName"];

但我不确定如何使用它来更新firstName中的primeUser?我很抱歉看起来很奇怪,我不是很清楚地解释它。希望你明白我想要实现的目标:)

3 个答案:

答案 0 :(得分:1)

使用Javascript getter / setter 功能:

  

get 语法将对象属性绑定到将要执行的函数   查找该属性时调用。

  

set 语法将对象属性绑定到要调用的函数   当试图设置该属性时。



const primeUser =  {
    nationality: 'Italian',
    age: 24,
    name: {
        get firstName() {
            return this._firstName;
        },
        set firstName(fName) {
            this._firstName = fName;
        },
        lastName: 'balboa',
    },
};
const user =  {
    nationality: 'Italian',
    age: 24,
    name: {
        get firstName() {
            return this._firstName;
        },
        set firstName(fName) {
            this._firstName = fName;
            primeUser.name.firstName = fName;
        },
        lastName: 'balboa',
    },
};

user.name.firstName = 'rocky';

console.log(primeUser.name.firstName);




https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/set

答案 1 :(得分:1)

  

我想将此更改传达给某个功能,以便它也可以更新   firstName在它自己的用户对象中也具有相同的结构

您可以在firstName属性上定义一个setter,并将setter函数作为您自己的函数传递,每次此属性更改时都会调用该函数

<强>演示

&#13;
&#13;
const user =  {
    nationality: 'Italian',
    age: 24,
    name: {
      firstName: 'rocky',
      lastName: 'balboa',
    },
  };
  
function yourFunction(val) {console.log("value set ",val)}
  
Object.defineProperty(user.name, "firstName" ,{set: yourFunction});

user.name.firstName = 1
&#13;
&#13;
&#13;

答案 2 :(得分:0)

您可以迭代所有属性并更新不同的值。

它适用于源和目标对象的任何相同结构。如果找到的属性是可迭代对象,则使用源对象和目标对象的实际属性进行递归函数调用。

&#13;
&#13;
function update(source, target) {
    Object.keys(source).forEach(function (k) {
        if (source[k] && typeof source[k] === 'object') {
            update(source[k], target[k]);
            return;
        }
        if (target[k] !== source[k]) {
            target[k] = source[k];
        }
    });
}

const user = { nationality: 'Italian', age: 24, name: { firstName: 'rocky', lastName: 'foo' } };
const primeUser = { nationality: 'Italian', age: 24, name: { firstName: 'rocky', lastName: 'balboa' } };

update(user, primeUser);
console.log(primeUser);
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
&#13;
&#13;

还有空对象的生成器。

&#13;
&#13;
function update(source, target) {
    Object.keys(source).forEach(function (k) {
        if (source[k] && typeof source[k] === 'object') {
            update(source[k], target[k] = target[k] || {});
            return;
        }
        if (target[k] !== source[k]) {
            target[k] = source[k];
        }
    });
}

const user = { nationality: 'Italian', age: 24, name: { firstName: 'rocky', lastName: 'balboa' } };
const primeUser = { };

update(user, primeUser);
console.log(primeUser);
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
&#13;
&#13;