如何更改javascript数组中的对象名称?

时间:2014-09-08 12:51:58

标签: javascript jquery ajax json

我在这个网站上找到了一些可能的解决方案,但没有一个真正帮助我前进。

我的数组看起来像这样:

[
  {"customerName":"Atelier graphique","addressLine1":"54, rue Royale"},
  {"customerName":"Signal Gift Stores","addressLine1":"8489 Strong St."},
  etc, etc

我想将customerName更改为value,将addressLine1更改为数据。我试过以下但我在这里做错了。

var myArray = [];

$(document).ready(function () {
    $("#text-id").on( 'click', function () {
        $.ajax({
            type: 'post',
            url: 'connect.php',

            success: function( data ) {
                console.log( data );
                myArray.push(data);

        }
    });
});


function DumpCustomers() {

    for(i=0;i<myArray.length; i++){
        myArray[i].addressLine1= "data";
        delete myArray[i].addressLine1;
        myArray[i].customerName= "value";
        delete myArray[i].customerName;
    }

    alert(myArray);

}

3 个答案:

答案 0 :(得分:6)

只需使用Array.map将数组值投影到所需的类型:

var myTransformedArray = myOriginalArray.map(function(item){
    return {
       value : item.customerName,
       data : item.addressLine1
    };
});

如果您需要支持旧浏览器,则可能需要在缺少map功能的情况下添加polyfill进行修补。上面的链接提供了符合ECMA-262 5 th Edition的实现:

if (!Array.prototype.map) {
  Array.prototype.map = function(callback, thisArg) {
    var T, A, k;
    if (this == null) {
      throw new TypeError(" this is null or not defined");
    }
    var O = Object(this);
    var len = O.length >>> 0;
    if (typeof callback !== "function") {
      throw new TypeError(callback + " is not a function");
    }
    if (arguments.length > 1) {
      T = thisArg;
    }
    A = new Array(len);
    k = 0;
    while (k < len) {
      var kValue, mappedValue;
      if (k in O) {
        kValue = O[k];
        mappedValue = callback.call(T, kValue, k, O);
        A[k] = mappedValue;
      }
      k++;
    }
    return A;
  };
}

答案 1 :(得分:0)

你不是那么遥远,但问问自己,这条线做了什么:

myArray[i].addressLine1= "data";

?右 - 它将myArray[i].addressLine1属性的值设置为"data"。那不是你想要的。 :-)您想要将一个名为data的新属性添加到myArray[i],并为其提供当前myArray[i].addressLine1中的值。您可以通过分配新属性名称来实现:

myArray[i].data = myArray[i].addressLine1;

E.g:

function DumpCustomers() {
    var i;

    for(i=0;i<myArray.length; i++){
        myArray[i].data = myArray[i].addressLine1;  // Change here
        delete myArray[i].addressLine1;
        myArray[i].value = myArray[i].customerName; // And here
        delete myArray[i].customerName;
    }

    alert(myArray);

}

...在某些时候,您需要调用代码DumpCustomers,或者将部件更改为成功处理程序。

请注意,我在顶部添加了var i。你的代码在没有它的情况下成为 The Horror of Implicit Globals 的牺牲品。

那就是说,如果这些是数组条目中唯一的两个属性,我可能每spender's answer使用map,或者做类似你的循环但是完全替换条目而不是修改它们:

function DumpCustomers() {
    var i;

    for(i=0;i<myArray.length; i++){
        myArray[i] = {
            data: myArray[i].addressLine1,
            value: myArray[i].customerName
        };
    }

    alert(myArray);

}

答案 2 :(得分:0)

尝试制作数组:)

像这样:

var myArray = [
  {"customerName":"Atelier graphique","addressLine1":"54, rue Royale"},
  {"customerName":"Signal Gift Stores","addressLine1":"8489 Strong St."}
],

newArray = [];
for(var i = 0, len = myArray.length; i < len; i++)
{
    newArray.push({'value': myArray[i]['customerName'], 'data': myArray[i]['addressLine1']});
}

myArray = newArray;