2
array1 = [ { id: "a", score: 1 }, { id: "b", score: 3 }, { id: "c", score: 8 }]
array2 = [ { id: "a", score: 2 }, { id: "z", score: 5 }, { id: "c", score: 1 }]
array3 = [ { id: "a", score: 3 }, { id: "f", score: 2 }, { id: "c", score: 2 }]

存在し、すべての配列で同じ id プロパティ値を持つオブジェクトのみを含む結果配列を取得するにはどうすればよいですか? すなわち:

resultyArray = [ 
  { id: "a", score: 1 }, 
  { id: "a", score: 2 }, 
  { id: "a", score: 3 },
  { id: "c", score: 8 },
  { id: "c", score: 1 },
  { id: "c", score: 2 }
]
4

1 に答える 1

1

ID がすべての配列に表示されるオブジェクトが「ユビキタス」であるとしましょう (名前付けは難しい =P):

filterUbiquitousObjects = (arrays...) ->
  objectsById = {}
  (objectsById[obj.id] or= []).push obj for obj in arr for arr in arrays 
  [].concat (arr for id, arr of objectsById when arr.length is arrays.length)...

array1 = [{ id: "a", score: 1 }, { id: "b", score: 3 }, { id: "c", score: 8 }]
array2 = [{ id: "a", score: 2 }, { id: "z", score: 5 }, { id: "c", score: 1 }]
array3 = [{ id: "a", score: 3 }, { id: "f", score: 2 }, { id: "c", score: 2 }]

console.log filterUbiquitousObjects array1, array2, array3
# Output:
# [{id:"a", score:1}, {id:"a", score:2}, {id:"a", score:3}, {id:"c", score:8}, 
# {id:"c", score:1}, {id:"c", score:2}]

ネストされたforループは少し醜いですが、どこかで失敗しない限り、これは O(n) (オブジェクトの総数は n) である必要があります。

更新:次のこともできます:

res = []
for id, arr of objectsById when arr.length is arrays.length
  res = res.concat arr
res

不可解な[].concat (arr for id, arr of objectsById when arr.length is arrays.length)...行の代わりに。それは間違いなくより読みやすく、より健全なJSを生成します:)

于 2013-03-15T23:35:56.220 に答える