我只是想知道是否有可能像下面那样在对象同级中引用self(对象)值?
[
{
"name": "Zulh",
"name_uppercase": uppercase(self.name) // expects ZULH
},
{
"name": "John",
"name_uppercase": uppercase(self.name) // expects JOHN
}
]
注意:
为简洁起见,省略了uppercase
的代码。在我的真实代码中,它正在执行复杂的同步操作,实际上并不是像这样简单的字符串大小写操作。
答案 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)
如果即使更改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)
或者正如@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种方法:
map
来返回具有更改后的值的新数组(为每个数组项调用一个函数)。见下文
let arr = [
{
"name": "Zulh",
},
{
"name": "John",
}
];
const newArr = arr.map((x)=>{
x.name_uppercase = (x.name).toUpperCase()
return x
})
console.log(newArr)
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
希望它会有所帮助:)