循环对象的对象并与数组内的对象进行比较

时间:2018-01-31 16:50:01

标签: javascript arrays object key

我在firebase中有这个烦人的难题,我需要将一个返回给我的对象与一个数组进行比较

我需要这个方法填写

const removeAlreadySeenUsersFromQueue = (newUsers, likedUsers) => {

}

基本上newUsers是一个对象数组。每个对象都有一个我感兴趣的ID。

然后,LikeUsers将作为对象对象的数组返回。看起来像这样:[{object1: {}, object2: {}, object3: {}]基本上是一个长度为1的数组。在每个对象中都有一个我感兴趣的id键。我基本上想比较这两个并返回一个数组,当某人的id只在newUsers中出现而不是在preferUsers中。我认为我需要潜在地使用object.keys(),但目前我无法正常使用

以下示例:

[{id: 4444}, {id: 5555}, {id: 6666}]

[{object1: {id: 4444}, object2: {id: 55555}, object3: {id: 121241}}]

在比较这两个之后,我只希望{id: 6666}返回给我。

3 个答案:

答案 0 :(得分:0)

您可以使用reduce获取ID,然后使用filtersome功能。

reduce可能会返回重复的元素[666, 555, 666, 777],但这超出了范围,因为您的示例没有重复的ID。

var source = [{ id: 4444 }, { id: 5555 }, { id: 6666 }, { id: 123456 }];
var content = [{ object1: { id: 4444 }, object2: { id: 5555 }, object3: { id: 121241 }}];

var ids = content.reduce((acc, curr) => [...acc, ...Object.keys(curr).map((k) => curr[k].id)] , []);

var result = source.filter((e) => {
  return !ids.some((c) => {
    return e.id === c;
  });
});

console.log(result);

资源

答案 1 :(得分:0)

这将与所呈现的数据一起使用,我将{ id: 7777 }添加到第一个输入,只是为了显示它处理多个匹配(可能相关也可能不相关)。

// input vars
var ar1 = [{id: 4444}, {id: 5555}, {id: 6666}, {id: 7777}];
var ar2 = [{object1: {id: 4444}, object2: {id: 5555}, object3: {id: 121241}}];

// output
var ar3 = ar1.filter(function(o) {
    // assume we're adding the element from ar1
    var result = true;

    // if we find the element from ar1 in ar2 then we won't add it
    Object.keys(ar2[0]).forEach(function(key) { if (ar2[0][key].id == o.id)     result = false; });

    // complete the filter function, adding elements not found
    return result;
});

// log the output
console.log(ar3);

答案 2 :(得分:-1)

你说你的阵列长度为1?你的意思是:[{}]? 将其更改为[{}, {}, {}]并使用for (element of array) - for of循环对其进行迭代。或者如果它必须是一个保存它们的对象,则通过for in循环遍历它。我的意思是,for (element in array[0])

EDIT 现在我看到了你的例子,这是一个片段:

const firstArray = [{id: 4444}, {id: 5555}, {id: 6666}];
const secondArray = [{object1: {id: 4444}, object2: {id: 55555}, object3: {id: 121241}}];

for (let object in secondArray[0]) {
   if (firstArray.some(el => el.id === secondArray[0][object].id)} {
      //do something
   }
}