Javascript 提取对象';属性,然后将其拼接到另一个对象中?
我对JS的世界还很陌生,我试着把我的头绕在对象上 为了了解一下上下文,我在这里的最终实验如下:我有一个表,它显示从csv收集的数据。这很有效!现在,下一个挑战是复制此表的现有列。事情很快就分崩离析了 我意识到我需要做的第一件事是提取我要复制的表的“列”。当然,当我说column时,我指的是“属性”(恰好显示为column) 好的,下面是一个不起作用的for循环:Javascript 提取对象';属性,然后将其拼接到另一个对象中?,javascript,angularjs,oop,Javascript,Angularjs,Oop,我对JS的世界还很陌生,我试着把我的头绕在对象上 为了了解一下上下文,我在这里的最终实验如下:我有一个表,它显示从csv收集的数据。这很有效!现在,下一个挑战是复制此表的现有列。事情很快就分崩离析了 我意识到我需要做的第一件事是提取我要复制的表的“列”。当然,当我说column时,我指的是“属性”(恰好显示为column) 好的,下面是一个不起作用的for循环: var namelist = [CSV Data]; // assume it's loaded var templist = [];
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]);
};
在我注入复制品后,它可能会如下所示:
[
{
"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问题。你可以通过几个助手来完成这项工作。首先,由于JavaScript对象是通过引用传递的,我建议不要修改原始对象,因此您需要一个助手来扩展对象。然后可以使用创建新集合:
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中的所有大写字母都是用于标识常量的约定。当你有数字时,确保你有数字,而不是字符串。这样做的目的是尽可能从源代码中完善数据,这样就不必在前端处理数据。如果数据已经被搞乱了,请考虑建立一个简单的解析器,首先将数据转换成需要使用的数据。
编辑:
要澄清
var y=extend({},x)
克隆集合中循环的当前对象,以避免更改原始对象。通过这种方式,您可以创建一个全新的系列acc
(累加器)是一个新的集合,我们在其中推送具有重复属性的克隆对象。这不是一个嵌套对象,而是一个集合(对象数组)。尝试查看map
、filter
和reduce
代码>?为什么所有东西都是大写的?如果需要大写字母,请在CSS中使用文本转换
,不要硬编码到代码中。@elclanrs,就像数据库本身发送CSV的方式一样。值得小写吗?@jovian,我现在在打电话,但我认为那不管用。控制台指示键是i的属性,因此它变为0:Bob Smith。。。我怀疑添加的内容只会使其成为0:Name:Bob SmithOK bro,这简直让我大吃一惊。我学得很快,但我得承认我对这个很陌生。像extend({},x)。。。发生什么事?我认为你在这里所做的可能很精彩,但为了真正吸收它,以便我可以更灵活地使用这种方法,我想了解更多的细节。你们介意用更明确的评论来编辑这篇文章吗?当然可以像解释我是五种类型的人一样来解释?谢谢请参阅我的编辑。希望有帮助。只需要知道对象始终是引用,如果要从旧对象中删除新对象,则需要克隆它们。为什么.reduce()
.map()
非常适合这种情况。@package:是的,你说得对,我改为使用map。这很有效!我仔细看了一下代码,起初没有意识到你自己做了扩展函数,这让我很困惑,因为我认为已经有一个object.extend函数了?
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);