【问题标题】:How to access other object sibling's value?如何访问其他对象兄弟的值?
【发布时间】:2018-07-11 08:54:01
【问题描述】:

我只是想知道是否可以像下面这样在对象兄弟中引用自身(对象)值?

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

注意

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

【问题讨论】:

  • 不,那不可能。
  • @Red,你确定吗?
  • @MihaiT Red 的意思是,OP 所写的方式是不可能的,self.name 不会引用当前对象。您将不得不依赖循环或其他函数/getter 方法
  • @MihaiT Rajesh 所说的正是我的意思。 OP 在他的例子中写的方式是不可能的。
  • 使用吸气剂怎么样?检查我的答案?

标签: javascript arrays object


【解决方案1】:

使用 GETTER

如果您想保持动态并使其即使更改name 属性也能正常工作,您可以使用GETTER 来执行此类操作:

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

console.log(names[0].name_uppercase)

多个对象的 GETTER

您不必手动为每个属性编写此代码!使用.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);

【讨论】:

  • 所以 OP 必须为数组中的每个对象写一个getter
  • 更好的方法是创建一个类并将这个函数添加到原型中
  • 有关我之前评论的更多信息,请参阅以下JSFiddle
  • 确实,这就是我对@Rajesh 的看法,我会将其添加到我的答案中
  • @Ivan 定义类的目的是消除不必要的循环。在循环中添加 getter 属性是个坏主意。因此,我在小提琴链接中描述了两种可能的方法
【解决方案2】:

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)

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      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() ) );

      【讨论】:

        【解决方案5】:

        您不能使用对象字面量语法来执行此操作,因为此时不会设置它的 '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 类语法。

        【讨论】:

          【解决方案6】:

          我建议两种方法:

          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)

          所以这一切都取决于你是否想改变你当前的数组

          【讨论】:

            【解决方案7】:

            使用 getter 方法怎么样?

            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
            

            希望对你有帮助:)

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2019-11-11
              • 2023-03-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-08-21
              • 2019-08-04
              相关资源
              最近更新 更多