让我说这里有这个对象:
var items = [
{name:"Foo"},
{name:"Bar"},
{name:"foo"},
{name:"bar"},
{name:"foobar"},
{name:"barfoo"}
];
由于每个对象中只有一个项目,我只想返回它们的列表。
我试过了:
var getSingle = function(rows){
var items = [];
//This should only return one column
for (var i = 0; i < rows.length; i++) {
var r = rows[i];
var c = 0;
for (var n in r) {
if(c == 0)
items.push(r[n]);
c += 1;
}
}
return items;
}
但它似乎不起作用。有什么想法吗?
PS。 name
可以是任何东西。
答案 0 :(得分:2)
这通常使用map
方法完成,请参阅the documentation here.
var justNamesArray = items.map(function(elem) { return elem.name});
documenation page还包含一个有用的填充程序,这是一种将其包含在代码中以支持旧版浏览器的方法。
在编辑中随附您的请求,如果您只想获取包含此属性的请求,则会有一个漂亮的filter方法。
var valuesWithNamePropert= items.filter(function(elem) { return elem.hasOwnProperty("name")});
你可以将两者联系起来
var justNamesWhereContains = items.filter(function(elem) { return elem.hasOwnProperty("name")}).
.map(function(elem) { return elem.name});
这种方法(映射和过滤)在支持JavaScript等一阶函数的语言中非常非常。
某些库(例如underscore.js)也提供了一种直接执行此操作的方法,例如在下划线中称该方法为pluck
。
编辑:在您确定属性可以在数组中的对象之间更改后,您可以使用以下内容:
var justReducedArray = items.map(function(elem) { for(i in elem){ return elem[i]}});
答案 1 :(得分:1)
您的var items = []
正在隐藏已包含数据的items参数。只是看到你的代码,我认为你的参数应该叫rows
答案 2 :(得分:1)
您可以覆盖项目的Array.toString方法,因此使用String(items)或alert(items)或items + =''将返回所需的字符串 -
var items = [{name:"Foo"}, {name:"Bar"},{name:"foo"},
{name:"bar"},{name:"foobar"},{name:"barfoo"}];
items.toString= function(delim){
delim=delim || ', ';
return this.map(function(itm){
return itm.name;
}).join(delim);
}
的字符串(项目)
/ *返回值:(String) Foo,Bar,foo,bar,foobar,barfoo * /
而不是默认字符串 - '[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]'
答案 3 :(得分:1)
如果你在一个世界&gt; = IE9,Object.keys()就可以了。它对于 对象的数组来说并不是非常有用,但它有助于数组的迭代(你可以使用Array.forEach来正确迭代数组,但是你会使用Object.keys( ob)[0]获取对象上第一个属性的值的方法。例如:
var someArr = [{ prop1: '1' },{ prop2: '2' },{ prop3: '3' }];
var vals = [];
someArr.forEach( function(obj) {
var firstKey = Object.keys(obj)[0];
vals.push(obj[firstKey]);
});
//vals now == ['1','2','3']
显然这不是null安全的,但它应该为您提供原始数组中每个对象的第一个属性值的数组。说快3倍。这也解除了对第一个属性名称的依赖性 - 如果第一个属性的名称很重要,那么对于forEach迭代,这是一个微不足道的变化。
答案 4 :(得分:1)
我使用了与其他方法不同的方法,因为我做了两个假设:
1 /您不知道密钥的名称,但每个项目只有一个密钥 2 /每个项目的关键可以不同 我将给你第二个选项,第二个假设为:2 /所有项目只有一个键,但所有这些都是相同的
第一选项:
var items = [
{name:"Foo"},
{name:"Bar"},
{name:"foo"},
{name:"bar"},
{name:"foobar"},
{name:"barfoo"}
];
// object keys very simple shim
Object.keys = Object.keys || function(o) {
var result = [];
for(var name in o) {
if (o.hasOwnProperty(name))
result.push(name);
}
return result;
};
// function to get the value of every first keys in an object
// just remember that saying "first key" does not make real sense
// but we begin with the assumption that there IS ONLY ONE KEY FOR EVERY ITEM
// and this key is unknown
function getFirstKeysValues(items) {
var i = 0, len = items.length, item = null, key = null, res = [];
for(i = 0; i < len; i++) {
item = items[i];
key = Object.keys(item).shift();
res.push(item[key]);
}
return res;
}
console.log(getFirstKeysValues(items)); //["Foo", "Bar", "foo", "bar", "foobar", "barfoo"]
第二个选项将使用地图,因为我们相信每个孩子都拥有相同的密钥(我不会使用这个,因为我不喜欢.map那么多 - 兼容性):
var items = [
{name:"Foo"},
{name:"Bar"},
{name:"foo"},
{name:"bar"},
{name:"foobar"},
{name:"barfoo"}
];
// object keys very simple shim
Object.keys = Object.keys || function(o) {
var result = [];
for(var name in o) {
if (o.hasOwnProperty(name))
result.push(name);
}
return result;
};
// function to get the value of every first keys in an object
// just remember that saying "first key" does not make real sense
// but we begin with the asumption that there IS ONLY ONE KEY FOR EVERY ITEM
// and this key is unknown but the same for every child
function getFirstKeysValues(items) {
var key = items.length > 0 ? Object.keys(items[0]).shift() : null;
items = items.map(function (item) {
return item[key];
});
return items;
}
console.log(getFirstKeysValues(items));