0

非常に単純な質問ですが、よくわかりません。それを出します。

sub_key に基づいて、新しい配列に結合する必要がある 2 つの js 配列があります。

var items = [
    Object { 
        OBJECTID=1,
        Name="COMMAND B", 
        ID="AR0xx",
        sub_key="1000"
        },
    Object {
        OBJECTID=2, 
        Name="95TH PCT", 
        ID="AR0xx",
        sub_key="1001"
        },
   Object { 
        OBJECTID=379, 
        Name="dummy4", 
        ID="AR0xx",
        sub_key="9999"
        }
   ];

var subitems = [
   Object { 
       OBJECTID=787, 
       ID="AR0xx", 
       sub_key=1000, 
       Long_Name = foo
       }, 
   Object { 
       OBJECTID=789, 
       ID="AR0xx", 
       sub_key=1001, 
       Long_Name = "bar"
       }, 
   Object { 
       OBJECTID=1, 
       ID="AR0xx", 
       sub_key=1001, 
       Long_Name="baz"
       }, 
   Object { 
       OBJECTID=788,
       ID="AR0xx", 
       sub_key=1001,
       Long_Name="buzzz"
       }
   ];

sub_keyに基づいて、上記の2つを組み合わせたような配列を作成したいと思います

var data = [
    COMMAND B=["foo"],
    95TH PCT=["bar","baz","buzz"]
    dummy4=[]
    ];

これが私が試したことですが、うまくいきません...私は近いと思いますか?? 助けてくれてありがとう!

data = [];
for (var key in items){
    var o = items[key];
    //data.push(o.Name);
    for (var subkey in subitems){
        subo = subitems[subkey];
        if (o.sub_key == subo.sub_key){
            data[o.Name].push(subo.Long_Name)
        }
    }
}
4

3 に答える 3

1

スクリプトをクリーンアップします。これがあなたがやろうとしていることです。item の Name と sub_items の一致する sub_key を使用して、オブジェクトの配列を作成します。

var items = [
  { OBJECTID: 1, 
    Name: 'COMMAND B', 
    ID: 'AR0xx', 
    sub_key: '1000' 
  }, 
  { OBJECTID: 2, 
    Name: '95TH PCT', 
    ID: 'AR0xx', 
    sub_key: '1001' 
  }, 
  { OBJECTID: 379, 
    Name: 'dummy4', 
    ID: 'AR0xx', 
    sub_key: '9999' 
  } 
]; 

var subitems = [ 
  { BJECTID: 787,
    ID: 'AR0xx', 
    sub_key: '1000', 
    Long_Name: 'foo' 
  }, 
  { OBJECTID: '789', 
    ID: 'AR0xx', 
    sub_key: '1001', 
    Long_Name: 'bar' 
  }, 
  { OBJECTID: '1', 
    ID: 'AR0xx', 
    sub_key: 1001, 
    Long_Name: 'baz' 
  }, 
  { OBJECTID: '788', 
    ID: 'AR0xx', 
    sub_key: '1001', 
    Long_Name: 'buzzz' 
  } 
]; 

var j = subitems.length;
var result = {};
var p;
var sub_key;
var obj;

for (var i=0, iLen = items.length; i<iLen; i++) {
  p = items[i].Name;
  result[p] = [];
  sub_key = items[i].sub_key;

  for (var j=0, jLen=subitems.length; j<jLen; j++) {

    if (subitems[j].sub_key == sub_key) {
      result[p].push(subitems[j].Long_Name);
    }
  }
}

alert(result['95TH PCT']); // bar, baz, buzz

編集

オブジェクトの配列ではなく、単一のオブジェクトを返します。これが必要だと思います。

于 2012-04-12T03:04:48.770 に答える
1
var newarray = items.slice(0); // make a copy
addloop: for (var i=0; i<subitems.length; i++) {
    for (var j=0; j<newarray.length; j++)
        if (subitems[i].sub_key == newarray[j].sub_key)
            continue addloop;
    newarray.push(subitems[i]);
}

動作するはずです。別の解決策:

Array.prototype.combine = function(a, test) {
    if (typeof test == "function") {
        for (var i=0; i<a.length; i++)
            if (! this.some(test.bind(null, a[i])))
                this.push(a[i]);
    } else {
        for (var i=0; i<a.length; i++)
            if (this.indexOf(a[i]) == -1)
                this.push(a[i]);
    }
    return this;
};

var newarray = items.slice(0).combine(subitems, function(a, b) {
    return a.sub_key == b.sub_key;
});
于 2012-04-12T02:16:14.863 に答える
0

電車の中でこれを書いたのですが、投稿できませんでした。それ以来、他の数人が良い回答を投稿しているようですが、それでも役立つかもしれないので、とにかく投稿します

注意すべき点がいくつかありました。

var items = [
    Object { 
        OBJECTID=1,
        Name="COMMAND B", 
        ID="AR0xx",
        sub_key="1000"
    },
    ...
  • ここに単語は必要ありません。Objectただ書くだけで{ ... }、JS はそれがオブジェクトであることを認識します。
  • オブジェクト内では、:代わりに=
  • 必須ではありませんが、キーを引用符で囲むことをお勧めします。

したがって、次のようになります。

var items = [
    { 
        "OBJECTID": 1,
        "Name": "COMMAND B", 
        "ID": "AR0xx",
        "sub_key": "1000"
    },
    ...

次に、2 番目のブロックで配列を使用して何をしているのか完全にはわかりませんがdata、3 番目のブロックで空の配列でオーバーライドしているようです。

Objectsまた、Arrays多少混乱することもあるかと思います。http://nfriedly.com/techblog/2009/06/advanced-javascript-objects-arrays-and-array-like-objects/には、違いの概要がよく示されていますが、いくつかの重要なポイントを次に示します。

  • ArrayのサブクラスですObject
  • Array値には、文字列キーではなく、常に数値インデックスがあります
  • push()Arrayない方法ですObject

次はループです。for .. inスタイル ループは配列に対して機能しますが、基になる に追加されたキーにもヒットする可能性があるため、一般的にはお勧めしませんObject私のお気に入りですが、 underscore.jsforEachなどのライブラリがない古いブラウザーでは常に利用できるとは限りません 。

for(var i=0, len=MyArray.length; i<len; i++) {...}は、すべての配列アイテムをカバーしますが、基になるオブジェクトにヒットする可能性がないため、非常によく見られるもう 1 つのオプションです。

しかし、Bergi と RobG はどちらも良いループを持っているので、ここで終了します。

于 2012-04-12T03:45:52.930 に答える