提取对象的属性,然后将其拼接到另一个对象中?

时间:2014-05-19 00:10:53

标签: javascript angularjs oop

我对JS世界很陌生,并试图绕过物体。

对于一些上下文,我在这里的最终实验如下:我有一个表,它显示从csv收集的数据。这很好用!现在,下一个挑战是复制此表的现有列。事情很快就崩溃了......

我意识到我需要做的第一件事是提取"列"我要复制的表格。当然,当我说专栏时,我指的是"属性" (恰好显示为列)。

好的,所以这里的for循环不起作用:

var namelist = [CSV Data]; // assume it's loaded
var templist = [];
for(var i =0; i < namelist.length; i++) {
   templist[i] = $namelist[i].NAME;
   console.log(templist[i]);
};

这只返回一个数组中的名字列表......我需要这个作为一个对象,输出像&#34; NAME:Bob Smith&#34;不只是&#34; Bob Smith&#34; ...我认为第一步是提取属性/列作为它自己的对象,然后将此属性作为新属性注入主混合中适用于对象的每个&#34;行&#34; /实例。

应该注意,这是一个嵌套对象,它的json类似于:

[
  {
    "ATTRIBUTES":"ACTIVE",
    "CODE":"21124",
    "TITLE":"JOB1",
    "NAME":"BOB SMITH",
  },
  {
    "ATTRIBUTES":"ACTIVE",
    "CODE":"14232",
    "TITLE":"JOB2",
    "NAME":"JOE SHMOE",
  },
  {
    "ATTRIBUTES":"ACTIVE",
    "CODE":"234234",
    "TITLE":"JOB3",
    "NAME":"MARY JONES",
  }
]

在我注射副本之后,应该看起来像这样:

[
  {
    "ATTRIBUTES":"ACTIVE",
    "CODE":"21124",
    "TITLE":"JOB1",
    "NAME":"BOB SMITH",
    "NAME2":"BOB SMITH",
  },
  {
    "ATTRIBUTES":"ACTIVE",
    "CODE":"14232",
    "TITLE":"JOB2",
    "NAME":"JOE SHMOE",
    "NAME2":"JOE SHMOE",
  },
  {
    "ATTRIBUTES":"ACTIVE",
    "CODE":"234234",
    "TITLE":"JOB3",
    "NAME":"MARY JONES",
    "NAME2":"MARY JONES",
  }
]

我期待您的想法!谢谢。

PS。我在AngularJS框架中工作,如果这有帮助,可能不是因为我认为这是一个非常好的&#34;基本&#34;核心javascript问题。

1 个答案:

答案 0 :(得分:1)

你可以用几个助手做到这一点。首先,当JavaScript对象通过引用传递时,我建议不要改变原始对象,因此你需要一个帮助来扩展对象。然后,您可以使用map创建新集合:

var coll = [
  {
    attributes:"active",
    code:21124,
    title:"job1",
    name:"Bob Smith",
  },
  {
    attributes:"active",
    code:14232,
    title:"job2",
    name:"Joe Shmoe",
  },
  {
    attributes:"active",
    code:234234,
    title:"job3",
    name:"Mary Jones",
  }
];

function extend(a, b) {
  Object.keys(b).forEach(function(k) {
    a[k] = b[k];
  });
  return a;
}

// @param {Object} props
//   where key is the property to duplicate,
//   and value the duplicate key name.
// @param {Array} a collection
function duplicateProperties(props, coll) {
  return coll.map(function(x) {
    var y = extend({}, x);
    for (var i in props) {
      y[props[i]] = x[i];
    }
    return y;
  });
}

// Usage
var coll2 = duplicateProperties({name: 'name2'}, coll);

另外,我建议不要在代码中使用全部大写字母。如果您需要更改文本的格式,请在您的UI代码(通常是CSS)中进行,不要硬编码;它看起来很糟糕,而且很麻烦。 JavaScript中的ALL CAPS是一种识别常量的约定。当你得到数字时,确保你有数字,而不是字符串。我们的想法是尽可能地从源代码中提取您的数据,因此您不必在前端混淆它。如果数据已经搞砸了,请考虑构建一个简单的解析器,首先将数据转换为您需要使用的数据。

修改

澄清var y = extend({}, x)克隆当前在集合中循环的对象,以避免改变原始对象。这样您就可以创建一个全新的集合。 acc(accumulator)是新集合,我们用重复的属性推送克隆对象。