如何访问其他对象同级的值?

时间:2018-07-11 08:54:01

标签: javascript arrays object

我只是想知道是否有可能像下面那样在对象同级中引用self(对象)值?

[
  {
    "name": "Zulh",
    "name_uppercase": uppercase(self.name) // expects ZULH
  },
  {
    "name": "John",
    "name_uppercase": uppercase(self.name) // expects JOHN
  }
]

注意

为简洁起见,省略了uppercase的代码。在我的真实代码中,它正在执行复杂的同步操作,实际上并不是像这样简单的字符串大小写操作。

7 个答案:

答案 0 :(得分:3)

You can't reference an object during initialization when using object literal syntax.。简而言之,这不可能达到您的期望

好吧,您可以使用map并向对象添加其他/修改的属性,例如

data.map(o=> ({name: o.name, upper_case : o.name.toUpperCase()}))

var data = [
  {
    "name": "Zulh" 
    
  },
  {
    "name": "John" 
   
  }
];

var x = data.map(o=> ({name: o.name, upper_case : o.name.toUpperCase()}))

console.log(x)

答案 1 :(得分:2)

使用GETTER

如果即使更改name属性,也要使其保持动态并使其正常工作,则可以使用GETTER来执行以下操作:

const names = [
  {
    "name": "John",
    get name_uppercase() {
      return this.name.toUpperCase();
    }
  }
]

console.log(names[0].name_uppercase)


多个对象的获取器

您不必手动为每个属性编写此代码!使用.forEach

const names = [
  {
    "name": "John"    
  },
  {
    "name": "Mike"
  }
]

names.forEach(object => {

  Object.defineProperty(object, 'nameUppercase', {
  
    get: function() { return this.name.toUpperCase() }
  
  });
  
});



console.log(names[0].nameUppercase)
console.log(names[1].nameUppercase)


使用一个类和一个GETTER

或者正如@Rajesh指出的那样,您可以改用类:

class Person {

  constructor(name) {
  
    this.name = name;
    
  }

  get nameUpperCase() {
  
    return this.name.toUpperCase();
  
  }

}

const names = [ new Person("John"), new Person("Mike")];

console.log(names[0].nameUpperCase);
console.log(names[1].nameUpperCase);

答案 2 :(得分:0)

您可以使用Array.forEach并更新Array中的对象

var data = [{"name": "Zulh"},{"name": "John"}];
data.forEach(o=> o.upper_case = o.name.toUpperCase());
console.log(data);

答案 3 :(得分:0)

为什么不创建一个转换传入数组的函数?一种实现方式可能是这样的:

const value = [
  {
    "name": "Zulh"
  },
  {
    "name": "John"
  }
];

const transform = ( array, propertyToUpdate, propertyToCreate, transformation ) => {
  return array.map( item => ({ ...item, [propertyToCreate]: transformation( item[propertyToUpdate] ) }) );
};

console.log( transform( value, 'name', 'name_uppercase', ( item ) => item.toUpperCase() ) );

答案 4 :(得分:0)

您不能使用对象字面量语法执行此操作,因为此时将不会设置它的“ this”属性。例如,如果您要在浏览器中运行代码,则“ this”将引用窗口对象。

因此,您将不得不使用其他答案之一或参加“班级”:

var uppercase = function( str ) {
  return str.toUpperCase();
};
var Person = function( name ) {
  this.name = name;
  this.name_uppercase = uppercase( this.name );
};
var persons = [
  new Person( 'zuhi' ),
  new Person( 'john' )
];
console.log( persons );

可以用ES6类语法编写相同的内容。

答案 5 :(得分:0)

我建议2种方法:

  1. 如果您不想更改初始数组(建议这样做),请使用map来返回具有更改后的值的新数组(为每个数组项调用一个函数)。

见下文

let arr = [
  {
    "name": "Zulh",
  },
  {
    "name": "John",
  }
];
const newArr = arr.map((x)=>{
	x.name_uppercase = (x.name).toUpperCase()
    return x
})
console.log(newArr)

  1. 如果您不介意更改初始数组,则可以使用forEach。请记住,与map不同,forEach会更改您的数组,因此它不会返回任何内容。

let arr = [
  {
    "name": "Zulh",
  },
  {
    "name": "John",
  }
];
arr.forEach((x)=>{
  x.name_uppercase = (x.name).toUpperCase()
})
console.log(arr)

所以这取决于您是否要更改当前数组

答案 6 :(得分:0)

使用吸气剂方法怎么样?

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

  

get语法将对象属性绑定到将要   查找该属性时调用。

foo = [
  {
    "name": "Zulh",
    get name_uppercase () {
        return (this.name).toUpperCase();
    }
  },
  {
    "name": "John",
    get name_uppercase () {
        return (this.name).toUpperCase();
    }
  }
]

console.log(foo[1].name_uppercase); //returns JOHN

希望它会有所帮助:)