0

以下のような2つの配列があります

  var arr = ["x", "y", "z", "a", "b", "c"];
  var tgtArr = [{val:"a"}, {val:"b"}]; It does not need to be as lengthy as Array `arr`

これは私が試したものです

  var dest = new Array(arr.length);
  for(var i = 0; i < arr.length; i++){
      for(var k = 0; k < tgtArr.length; k++){
          dest[i] = dest[i] || [];
          if(tgtArr[k].val == arr[i]){
              dest[i] = arr[i];
          }
      }
  }
  console.log(dest);

私の期待される出力は(上記のtgtArr値の場合)

  [{}, {}, {}, {val:"a"}, {val:"b"}, {}];

tgtArr空の配列の場合

  [{},{},{},{},{},{}]      

これがフィドルです。これに代わるものはありますが、毎回配列全体を反復処理しているため、これは良い方法ではないようです。

4

5 に答える 5

2

短い:

var result = arr.map(function(x) {
    return tgtArr.some(function(o) { return o.val == x; }) ? {val:x} : {};
});

これはより効率的です:

var set = {};
tgtArr.forEach(function(obj, i) {
    set[obj.val] = true;
});
var result = arr.map(function(x) {
    return x in set ? {val:x} : {};
});
于 2013-11-01T03:42:35.003 に答える
1

これはポールの答えと同じですが、mapの代わりにループがあります。最初にvalプロパティに基づいてキーを収集し、キーが tgtArr にない場合は空のオブジェクトを使用して新しい配列を作成するか、次の場合は tgtArr からオブジェクトへの参照をコピーします。

function newArray(arr, tgtArr) {
  var keys = {},
      i = tgtArr.length,
      j = arr.length,
      newArr = [];

  // Get keys
  while (i--) keys[tgtArr[i].val] = tgtArr[i];

  // Make new array
  while (j--) newArr[j] = arr[j] in keys? keys[arr[j]] : {};

  return newArr; 
}

各配列を 1 回だけトラバースするため、効率的です。

于 2013-11-01T03:37:28.940 に答える
1
var dest = new Array(arr.length);
  for(var i = 0; i < arr.length; i++){
      dest[i] = {}
      for(var k = 0; k < tgtArr.length; k++){
          if(tgtArr[k].val == arr[i]){
              dest[i] = tgtArr[k];
          }
      }
  }
  console.log(dest);
于 2013-11-01T03:07:39.907 に答える
1

map私はこの種のループではなく使用するのが好きです( Fiddle):

var result = arr.map(function(x) {
    var match = tgtArr.filter(function(y) {
        return y.val == x;
    });
    if (match.length == 1) return match[0];
    else return {};
});

これは、 O(n*m)tgtArr内のすべてのアイテムをトラバースするという点で、非効率的である可能性があります。必要に応じて、前処理してハッシュ マップ ( Fiddlearr ) に変換することで修正できます。このようにして、O(n+m) アルゴリズムが得られます (各配列を 1 回トラバースします)。tgtArr

var tgtMap = {};
tgtArr.forEach(function(x) { tgtMap[x.val] = x; })
var result = arr.map(function(x) {
    var match = tgtMap[x];
    return match || {};
});
于 2013-11-01T03:08:01.493 に答える