0

假设我在这里有这个对象:

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可以是任何东西。

4

5 回答 5

2

这通常使用该map方法完成,请参阅此处的文档。

   var justNamesArray = items.map(function(elem) { return elem.name});

文档页面还包含一个有用的shim,这是一种将其包含在代码中以支持旧浏览器的方法。

伴随您在编辑中的请求,如果您只想获取包含此属性的那些,则有一个漂亮的过滤器方法。

 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]}});
于 2013-03-08T03:24:24.207 回答
2

我使用了与其他方法不同的方法,因为我做了两个假设:

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));
于 2013-03-08T04:05:59.147 回答
1

var items = []正在隐藏已包含数据的 items 参数。只是通过查看您的代码,我认为也许应该调用您的参数rows

于 2013-03-08T03:26:56.117 回答
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]'

于 2013-03-08T03:35:11.960 回答
1

如果你在一个 >= 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']

显然这不是空安全的,但它应该为您提供原始数组中每个对象的第一个属性的值的数组。快说3倍。这也解耦了对第一个属性的名称的任何依赖——如果第一个属性的名称很重要,那么它对 forEach 迭代的更改是微不足道的。

于 2013-03-08T04:05:38.490 回答