JavaScript对象数组包含相同的数组数据

时间:2019-03-25 10:04:34

标签: javascript arrays

我尝试将所有相同的数据值放入对象数组。这是我的输入:

var a = [{
    name: "Foo",
    id: "123",
    data: ["65d4ze", "65h8914d"]
  },
  {
    name: "Bar",
    id: "321",
    data: ["65d4ze", "894ver81"]
  }
]

我需要这样的结果:

["65d4ze"]

我尝试在我的对象上循环以获取此输出,但是我完全迷路了……我不知道如何知道结果是否进入所有数据数组。

var a = [{
        name: "Foo",
        id: "123",
        data: ["65d4ze", "65h8914d"]
      },
      {
        name: "Bar",
        id: "321",
        data: ["65d4ze", "894ver81"]
      }
    ],
  b = [],
  c = []
a.forEach(function(object) {
  b.push(object.data.map(function(val) {
    return val;
    })
  );
});

console.log(b);

5 个答案:

答案 0 :(得分:12)

您可以映射data并获得与Array#mapArray#reduceArray#filterSetSet#has的公共值。

var array = [{ name: "Foo", id: "123", data: ["65d4ze", "65h8914d"] }, { name: "Bar", id: "321", data: ["65d4ze", "894ver81"] }],
    key = 'data',
    common = array
        .map(o => o[key])
        .reduce((a, b) => b.filter(Set.prototype.has, new Set(a)));

console.log(common);

答案 1 :(得分:3)

您可以使用Array#filter方法。通过使用Array#every方法检查所有其他对象的属性(数组)中是否存在值来过滤第一个数组。

let res = a[0].data.filter(v => a.slice(1).every(a => a.data.includes(v)));

var a = [{
    name: "Foo",
    id: "123",
    data: ["65d4ze", "65h8914d"]
  },
  {
    name: "Bar",
    id: "321",
    data: ["65d4ze", "894ver81"]
  }
];

let res = a[0].data.filter(v => a.slice(1).every(a => a.data.includes(v)));

console.log(res)

答案 2 :(得分:1)

var a = [{
      name: "Foo",
      id: "123",
      data: ["65d4ze", "65h8914d"]
    },
    {
      name: "Bar",
      id: "321",
      data: ["65d4ze", "894ver81"]
    }
  ],
  b = {};
a.forEach(function(i) {
  i.data.forEach(function(j) {
    if (!b.hasOwnProperty(j)) {
      b[j] = 0;
    }
    b[j] = b[j] + 1;
  });
});
c = []
for (var i in b) {
  if (b.hasOwnProperty(i)) {
    if (b[i] > 1) {
      c.push(i)
    }
  }
}
console.log(c);

答案 3 :(得分:1)

在数组中使用flat函数:

var a = [{
        name: "Foo",
        id: "123",
        data: ["65d4ze", "65h8914d"]
      },
      {
        name: "Bar",
        id: "321",
        data: ["65d4ze", "894ver81"]
      }
    ],
  b = [],
  c = []
a.forEach(function(object) {
  b.push(object.data.map(function(val) {
    return val;
    })
  );
});

console.log(b.flat());

答案 4 :(得分:1)

您可以在每个数据数组上使用reduceconcat,并检查每个项目的计数。

最后,您检查数组中的所有对象是否都包含该项目,如果是,则将其返回。

请注意,如果您要提取在数组中所有对象中都出现相同项目的项目,则此函数有效。

如果某项重复项,但不满足上述条件,则不会将其提取。

let a = [{name: "Foo",id: "123",data: ["65d4ze", "65h8914d"]},{name: "Bar",id: "321",data: ["65d4ze", "894ver81"]}]

let arr = a.reduce((prev,next) => prev.data.concat(next.data))
let counts = {};
let result = [];
for (var i = 0; i < arr.length; i++) {
  var num = arr[i];
  counts[num] = counts[num] ? counts[num] + 1 : 1;
}

for (let i in counts) {
    if (counts[i] === a.length) {
        result.push(i)
    }
}
console.log(result)