所以我有一个对象。我想迭代它并返回相同的对象,但有其他属性。我已完成以下操作,但它返回旧数据。
public void Populate_Data_Grid2_All()
{
string sqlQuery = "EXEC sp_CG_GMR_Select_Specific_Data";
using (var connection = new SqlConnection(connectionString))
using (var command = new SqlCommand(sqlQuery, connection))
using (var adapter = new SqlDataAdapter(command))
{
connection.Open();
var myTable = new DataTable();
adapter.Fill(myTable);
dataGridView2.DataSource = myTable;
}
dataGridView2.Columns[0].Width = 60;
dataGridView2.Columns[0].ReadOnly = true;
dataGridView2.Columns[1].Width = 40;
dataGridView2.Columns[1].ReadOnly = true;
dataGridView2.Columns[2].Width = 50;
dataGridView2.Columns[2].ReadOnly = true;
dataGridView2.Columns[3].Width = 250;
dataGridView2.Columns[3].ReadOnly = true;
dataGridView2.Columns[4].Width = 100;
dataGridView2.Columns[4].ReadOnly = true;
dataGridView2.Columns[4].DefaultCellStyle.Format = "N2";
}
好的,我甚至尝试过,但仍然没有运气
public void Populate_Data_Grid1(string DataExists, string Scheme)
{
string NoCurrentPeriodData = "EXEC sp_CG_GMR_Scheme_Manual_Entry_Template @Scheme = '"+Scheme+"'";
string YesCurrentPeriodData = "EXEC sp_CG_GMR_Current_Period_Data @Scheme = '"+Scheme+"'";
string sqlQuery;
if(DataExists())
{
sqlQuery = YesCurrentPeriodData;
}
else
{
sqlQuery = NoCurrentPeriodData;
}
using (var connection = new SqlConnection(connectionString))
using (var command = new SqlCommand(sqlQuery, connection))
using (var adapter = new SqlDataAdapter(command))
{
connection.Open();
var myTable = new DataTable();
adapter.Fill(myTable);
dg_Data1.DataSource = myTable;
}
//--Data Grid Column Properties--\\
dg_Data1.Columns[0].Visible = false;
dg_Data1.Columns[2].Visible = false;
dg_Data1.Columns[4].Visible = false;
dg_Data1.Columns[6].Visible = false;
dg_Data1.Columns[1].Width = 60;
dg_Data1.Columns[1].ReadOnly = true;
dg_Data1.Columns[3].Width = 40;
dg_Data1.Columns[3].ReadOnly = true;
dg_Data1.Columns[5].Width = 50;
dg_Data1.Columns[5].ReadOnly = true;
dg_Data1.Columns[7].Width = 250;
dg_Data1.Columns[7].ReadOnly = true;
dg_Data1.Columns[8].Width = 100;
dg_Data1.Columns[8].DefaultCellStyle.Format = "N2";
//dg_Data1.Columns[8].DefaultCellStyle.Format = "D";
btn_SaveValues.Enabled = true;
}
答案 0 :(得分:0)
因为扩展会复制第一个对象的第二个对象的属性:http://underscorejs.org/#extend
我不确定你想要什么,但是不能解决这个问题吗?
_.each(data, function(item) {
//set item.first property on item.name
item.name = item.first;
});
//var data is still the same array with same objects, but all the objects inside are updated.
在这里,你想要的是什么:
var yourNewArray = data.map(function(item){
//clone item so you dont have reference to object in dat array
var newItem = _.clone(item);
//set property on another property
newItem.name = newItem.first;
return newItem;
}
另一种方法,如果你只想要特定的属性作为对象数组:
var yourNewArray = data.map(function(item){
return { name : item.first}; //return object with property name, with value from original object.first property
}
请记住:数组包含对象引用的列表。所以你不能简单地改变对象,你需要克隆它们,这样你才不会改变原始数组。
答案 1 :(得分:0)
您可以更好地使用Array.map
来实现此目标
var newData = data.map(function(i){
i['name'] = i.first;
return i;
})
答案 2 :(得分:0)
var data = {
a : { first : 'albert'},
b : { first : 'bob' },
c : { first : 'charle'}
};
for ( var item in data ) {
data[item].name = data[item].first;
}
如果你想改变一个物体,你不应该"返回"它,因为是废话,javascript无论如何都不复制对象,return会给出同一数据对象的链接,如果你改变这个对象也会改变数据,如果你真的有不同的对象,你需要做的您对象的深层副本。
例:
a = {name:'albert'};
b = a;
b.name = 'bob';
console.log(a);
将显示{ name: 'bob' }