迭代对象并添加新属性

时间:2016-03-29 14:41:48

标签: javascript object underscore.js

所以我有一个对象。我想迭代它并返回相同的对象,但有其他属性。我已完成以下操作,但它返回旧数据。

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;

        }

3 个答案:

答案 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' }