如何在不经过循环的情况下将对象与JavaScript中的其他对象内部值合并?

时间:2018-07-25 09:49:55

标签: javascript reactjs ecmascript-6

如果我的state对象是这样,

this.state={
  input:{
    employee_count_range: {
        value: props.employee_count_range || '',
        errMsg: null
    },
    phone: {
        value: '',
        errMsg: null
    },
    city: {
        value: '',
        errMsg: null
    }
  }
}

user对象就是这样,

let user = {
   employee_count_range: '',
   phone: '',
   city: ''
}

ES6是否可以通过循环进行任何操作?

Object.keys(this.state.inputs)
     .map(field => user[field] = this.state.input[field].value);

我想将state中的每个value对象分配给user对象值

1 个答案:

答案 0 :(得分:3)

在回答我的问题“重要的是,您要动态地发现this.state.inputs中属性的名称,还是可以按字面意义列出它们?” ,{{3 }}:

  

可以按字面意思列出它们。我知道我可以循环执行。我只想知道是否有可能。

当然,根本不需要循环,直接分配是一种简单直接的方法:

user.employee_count_range = this.state.inputs.employee_count_range.value;
user.phone = this.state.inputs.phone.value;
user.city = this.state.inputs.city.value;

实时示例(使用state而非this.state):

const state = {
  inputs: {
    employee_count_range: {
      value: 42
    },
    phone: {
      value: "123 456 7890"
    },
    city: {
      value: "London"
    }
  }
};
const user = {};

user.employee_count_range = state.inputs.employee_count_range.value;
user.phone = state.inputs.phone.value;
user.city = state.inputs.city.value;

console.log(user);

您也可以使用解构分配来做到这一点,但是它并不能为您带来任何好处,而且阅读起来很棘手:

({
  employee_count_range: {value: user.employee_count_range},
  phone: {value: user.phone},
  city: {value: user.city}
} = this.state.inputs);

实时示例(使用state而非this.state):

const state = {
  inputs: {
    employee_count_range: {
      value: 42
    },
    phone: {
      value: "123 456 7890"
    },
    city: {
      value: "London"
    }
  }
};
const user = {};

({
  employee_count_range: {value: user.employee_count_range},
  phone: {value: user.phone},
  city: {value: user.city}
} = state.inputs);

console.log(user);


以下所有内容均假定您要动态查找属性名称,现在事实并非如此。

如果您想复制此内容:

Object.keys(this.state.inputs)
     .map(field => user[field] = this.state.inputs[field].value);

...根本没有任何形式的循环构造,那么就没有办法做到这一点。您将需要某种循环。


但是,

map不是正确的选择,因为您没有使用它的返回值。 forEachfor-of循环将是更合适的选择:

Object.keys(this.state.inputs)
    .forEach(field => user[field] = this.state.inputs[field].value);

for (const field of Object.keys(this.state.inputs)) {
    user[field] = this.state.inputs[field].value;
}

您可以使用this.state.iputs[field].value而不是Object.entries来避免进行第二次查找(Object.keys)(但这涉及到一堆临时数组,因此……要取舍):

for (const [field, value] of Object.entries(this.state.inputs)) {
    user[field] = value;
}

或使用forEach

Object.entries(this.state.inputs).forEach(([field, value]) => {
    user[field] = value;
});