0

ここにこのオブジェクトがあるとしましょう:

var items = [
    {name:"Foo"},
    {name:"Bar"},
    {name:"foo"},
    {name:"bar"},
    {name:"foobar"},
    {name:"barfoo"}
];

各オブジェクトにはアイテムが 1 つしかないため、それらのリストを返したいだけです。

私はこれを試しました:

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

私は 2 つの前提を置いているため、他のアプローチとは異なるアプローチを使用しました。

1/ キーの名前はわかりませんが、すべてのアイテムに 1 つのキーしかありません 2/ キーはすべてのアイテムで異なる可能性があります 2 番目のオプションを提示します。2 番目の仮定は次のとおりです。2/ すべてのアイテムがキーは1つだけですが、それはすべて同じです

最初のオプション:

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"]

2 番目のオプションでは、すべての子が同じキーを持っていると考えているため、マップを使用します (私は .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 に答える
2

これは通常、mapメソッドを使用して実現されます。こちらのドキュメントを参照してください。

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

ドキュメント ページには便利な shim も含まれています。これは、古いブラウザーをサポートするためにコードに含める方法です。

編集でリクエストに付随して、このプロパティを含むものを取得したい場合は、気の利いたフィルターメソッドがあります。

 var valuesWithNamePropert= items.filter(function(elem) { return elem.hasOwnProperty("name")});

2つをチェーンして取得できます

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 に答える
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);
}

文字列(アイテム)

/* 戻り値: (文字列) 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

すでにデータが含まれてvar items = []いる項目パラメーターをシャドウしています。あなたのコードを見るだけで、おそらくあなたのパラメーターを呼び出す必要があると思いましたrows

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

明らかに、これは null セーフではありませんが、元の配列内の各オブジェクトの最初のプロパティの値の配列を取得する必要があります。それを3回速く言ってください。これにより、最初のプロパティの名前への依存関係も切り離されます。最初のプロパティの名前が重要な場合は、forEach 反復に対する些細な変更です。

于 2013-03-08T04:05:38.490 に答える