【问题标题】:Extracting an object's properties, then splicing it into another object?提取对象的属性,然后将其拼接到另一个对象中?
【发布时间】:2014-05-19 00:10:53
【问题描述】:

我对 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]);
};

这只是返回一个数组中的名称列表......我需要这个作为一个对象,它会输出类似“NAME:Bob Smith”而不仅仅是“Bob Smith”......我认为第一步是将属性/列提取为它自己的对象,然后将此属性作为适用于对象的每个“行”/实例的新属性注入主组合。

需要注意的是这是一个嵌套对象,里面有一个类似这样的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",
  }
]

期待你的想法!谢谢。

附言。如果有帮助,我正在使用 AngularJS 框架,可能不是因为我认为这是一个非常“基本”的核心 javascript 问题。

【问题讨论】:

  • 那不是嵌套对象,那是一个集合(对象数组)。尝试查看mapfilterreduce
  • 为什么不使用templist[i] = "Name:"+$namelist[i].NAME;
  • 为什么所有内容都大写?如果需要大写,请在 CSS 中使用 text-transform,不要将其硬编码到代码中。
  • @elclanrs,就像数据库本身发送 CSV 的方式一样。值得小写吗?
  • @jovian,我现在正在使用手机,但我认为这行不通。控制台指示键是 i 的属性,因此它变为 0:Bob Smith... 我怀疑添加只会使其变为 0:名称:Bob Smith

标签: javascript angularjs oop


【解决方案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(累加器)是新的集合,我们在其中推送具有重复属性的克隆对象。

【讨论】:

  • 好的兄弟,这简直让我大吃一惊。我是一个快速学习者,但必须承认我对此很陌生。比如extend({}, x)...这是怎么回事?我认为您在这里所做的可能很棒,但是为了真正吸收它,以便我可以更灵活地使用此方法,我希望了解更多有关正在发生的事情的细节。你介意用更明确的评论来编辑这个,就像我是五型一样解释它吗?谢谢!
  • 查看我的编辑。希望有帮助。只需要知道对象总是引用,如果你想从旧对象中取出新对象,你需要克隆它们。
  • 为什么是.reduce().map() 非常适合这种情况。
  • @package: 是的,你说得对,我改用map了。
  • 这成功了!我更好地查看了代码,但最初并没有意识到您制作了自己的扩展函数,这让我感到困惑,因为我认为那里已经有一个 object.extend 函数?
猜你喜欢
  • 2020-06-22
  • 2016-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多