0

これら 2 つのオブジェクトを 1 つにマージし、キーも追加する最良の方法は何ですか。私はすでに多くのことを試しましたが、JavaScript がオブジェクトと配列でどのように機能するかについて迷っています...誰が私を正しい方向に導くことができますか? プレーンJSまたはjqueryのいずれか。

オブジェクト 1

["EUR 1,99", "EUR 0,99", "EUR 4,99", "EUR 2,29", "EUR 1,43", "EUR 1,60", "EUR 1,79", "EUR 1,79", "EUR 1,39", "EUR 6,30", "EUR 1,43", "EUR 1,78", "EUR 1,90", "EUR 1,24", "EUR 1,41"]

オブジェクト 2

["Popken", "Lucky Animal", "mein-terrarium", "zooup", "zoofair", "XL-Hundeshop", "tiierisch-de", "Zoo Galaxie", "Petshop", "Danto GmbH", "Heimtierbedarf-Mazinke", "TIERKOSMOS", "Gazoma", "Zooheld", "dasko24"]

ご希望の物件

[[Price="EUR 1,99",Name="Popken"],[Price="EUR 0,99",Name="Lucky Animal"],[Price="EUR 4,99",Name="mein-terrarium"], etc....]  
4

4 に答える 4

0

これは一般的な解決策です。リストのオブジェクトではなく、オブジェクトのリストを取得するように、オブジェクトを「折りたたむ」ことです。

function refold_list_from_object(data) {
    "use strict"    
    var keys = Object.keys(data),
        descriptor = {configurable: true, enumerable: true, writable: true, value: null},
        properties = keys.reduce(function(p, k){
            p[k] = descriptor
            return p
        }, {}),
        nrecords = Math.max.apply(null, keys.map(function(k){return data[k].length})),
        records  = [], vi
    function makerecord() {
        return Object.create(null, properties)
    }
    function record_from_value_index(vi) {
        return keys.reduce(function(obj, k) {
            obj[k] = data[k][vi] || null
            return obj
        }, makerecord())
    }
    for (vi = 0; vi < nrecords; vi++) {
        records.push(record_from_value_index(vi))
    }
    return records
}

dataフィールド名でインデックス付けされたリストを持つオブジェクトでなければなりません:

var data = {
    Price: ["EUR 1,99", "EUR 0,99", "EUR 4,99", "EUR 2,29", "EUR 1,43", "EUR 1,60", "EUR 1,79", "EUR 1,79", "EUR 1,39", "EUR 6,30", "EUR 1,43", "EUR 1,78", "EUR 1,90", "EUR 1,24", "EUR 1,41"],
    Name: ["Popken", "Lucky Animal", "mein-terrarium", "zooup", "zoofair", "XL-Hundeshop", "tiierisch-de", "Zoo Galaxie", "Petshop", "Danto GmbH", "Heimtierbedarf-Mazinke", "TIERKOSMOS", "Gazoma", "Zooheld", "dasko24"],
    // An extra field to demonstrate padding:
    Description: ['Foo', 'Bar', 'Baz']
}

var recordlist = refold_list_from_object(data)

recordlist次のようになります。

[
  {"Price":"EUR 1,99", "Name":"Popken",         "Description":"Foo"},
  {"Price":"EUR 0,99", "Name":"Lucky Animal",   "Description":"Bar"},
  {"Price":"EUR 4,99", "Name":"mein-terrarium", "Description":"Baz"},
  {"Price":"EUR 2,29", "Name":"zooup",          "Description":null},
  {"Price":"EUR 1,43", "Name":"zoofair",        "Description":null},
  {"Price":"EUR 1,60", "Name":"XL-Hundeshop",   "Description":null},
  {"Price":"EUR 1,79", "Name":"tiierisch-de",   "Description":null},
  {"Price":"EUR 1,79", "Name":"Zoo Galaxie",    "Description":null},
  {"Price":"EUR 1,39", "Name":"Petshop",        "Description":null},
  {"Price":"EUR 6,30", "Name":"Danto GmbH",     "Description":null},
  {"Price":"EUR 1,43", "Name":"Heimtierbedarf-Mazinke", "Description":null},
  {"Price":"EUR 1,78", "Name":"TIERKOSMOS",     "Description":null},
  {"Price":"EUR 1,90", "Name":"Gazoma",         "Description":null},
  {"Price":"EUR 1,24", "Name":"Zooheld",        "Description":null},
  {"Price":"EUR 1,41", "Name":"dasko24",        "Description":null}
]
于 2013-03-11T22:05:19.417 に答える
0

underscore.js の zip 関数を使用したソリューション

var prices = ["EUR 1,99", "EUR 0,99", "EUR 4,99", "EUR 2,29", "EUR 1,43", "EUR 1,60", "EUR 1,79", "EUR 1,79", "EUR 1,39", "EUR 6,30", "EUR 1,43", "EUR 1,78", "EUR 1,90", "EUR 1,24", "EUR 1,41"];

var products = ["Popken", "Lucky Animal", "mein-terrarium", "zooup", "zoofair", "XL-Hundeshop", "tiierisch-de", "Zoo Galaxie", "Petshop", "Danto GmbH", "Heimtierbedarf-Mazinke", "TIERKOSMOS", "Gazoma", "Zooheld", "dasko24"];

var result = _.map(_.zip(products, prices), function(arr) {
    return {
        Price: arr[1],
        Name: arr[0]
    };
});


console.log(result);
于 2013-03-11T19:53:26.613 に答える
0
var newList = [];

for(var i=0; i<obj1.length; i++){
    newList.push({
        Price: obj1[i],
        Name: obj2[i]
    });
}

これにはエラー処理がなく、配列の map 関数を使用するより良い方法があるかもしれませんが、元のオブジェクトの両方の長さが同じである限り、これは機能するはずです。

于 2013-03-11T19:46:53.730 に答える
0

かなり簡単なはずです。arr1が価格の配列であり、arr2が名前の配列であると仮定します。

var newarr = [],
    len = (number of items);

for(var i=0;i<len;i++){
    newarr.push({
        Price:arr1[i];
        Name:arr2[i];
    });
}
于 2013-03-11T19:48:24.793 に答える