0

値を新しい配列にマップしようとしています。問題は、マッピングしているプロパティが数値または配列のいずれかになる可能性があることです。

私の結果は連想配列であるため、配列に関しては問題があります。私の目標は、[[1,2,3], [1,2,3]](下記参照) をに変換すること[1,2,3,1,2,3]です。言い換えると; 1次元配列にするだけです。

map() 内で foreach ループを試しましたが、成功しませんでした。何か案は?

var list = [{ foo: 1, bar: [1,2,3] }, { foo: 2, bar: [1,2,3] }];

var retArr = list.map(function (v) {

    return v.bar;

});

console.log(retArr); // [[1,2,3], [1,2,3]]

var list = [{ foo: 1, bar: [1,2,3] }, { foo: 2, bar: [1,2,3] }];

var retArr = list.map(function (v) {

    if($.isArray(v.bar)){

        $.each(v.bar, function(i, v){

            return v;
        });

    } else {

        return v.bar;
    }
});

console.log(retArr); // [undefined, undefined] 

http://jsfiddle.net/Mck7N/

4

3 に答える 3

4

jQuery のmapfunctionを使用すると、配列の平坦化が自動的に行われます。

関数は [...] 値の配列を返すことができます。これは完全な配列にフラット化されます

var retArr = $.map(list, function (v) {
    return v.bar;
});

2 番目の例では[undefined, undefined]、コールバックから値を返していないため、結果として得られます。コールバックの戻り値は、$.eachコールバックの戻り値には影響しません.map

.mapコールバックから返せる値は 1 つだけなので、ここでは役に立ちませんでした。代わりに、配列を反復処理できます。

var retArr = [];

list.forEach(function (v) {
    if ($.isArray(v.bar)) {
        retArray.push.apply(retArray, v.bar);
    } 
    else {
        retArray.push(v.bar);
    }
});

または、 を使用することもできますArray#reduce。しかし、とにかく jQuery を使用しているので、その map 関数を使用するのが最も簡単な解決策です。

于 2013-05-18T09:02:46.503 に答える