【问题标题】:How to find and remove the elem that match in two different arrays? Javascript如何查找和删除两个不同数组中匹配的元素? Javascript
【发布时间】:2020-10-14 13:31:21
【问题描述】:

如何查找和删除两个不同数组中匹配的元素?

例如

let arr = [
    { startTimestamp: 1602675569525, name: "Pip" },
    { startTimestamp: 1602664708822, name: "Jimmy" },
    { startTimestamp: 1234, name: "Hero" }
];

let arr2 = [
    { startTimestamp: 1602675569525, name: "Pip" },
    { startTimestamp: 1602664708822, name: "Jimmy" }, 
    { startTimestamp: 505050, name: "Kit" }

];

如果startTimestamp 匹配,那么我想删除那些元素。输出应该是

[
   { startTimestamp: 1234, name: "Hero" },
   { startTimestamp: 505050, name: "Kit" }
]

我在下面尝试过,但它只给了我[{startTimestamp: 1234, name: "Hero"}],因为我只是在推动 arr[i] 但我还需要{ startTimestamp: 505050, name: "Kit" }

let newArr = []; 

for (let i = 0; i < arr.length; i++) {
    if(arr[i].startTimestamp !== arr2[i].startTimestamp) {
            newArr.push(arr[i])
     }
    
}

【问题讨论】:

标签: javascript arrays object filter


【解决方案1】:

最好将它们合并,然后过滤双精度:

const newArr = [...arr, ...arr2].filter(
  (item, index, self) => item.findIndex(
    (prev) => prev.startTimestamp === item.startTimestamp
  ) === index
);

【讨论】:

    【解决方案2】:

    最好合并两个数组并通过删除重复的startTimestamp 对象来过滤项目。

    let arr = [
        { startTimestamp: 1602675569525, name: "Pip" },
        { startTimestamp: 1602664708822, name: "Jimmy" },
        { startTimestamp: 1234, name: "Hero" }
    ];
    
    let arr2 = [
        { startTimestamp: 1602675569525, name: "Pip" },
        { startTimestamp: 1602664708822, name: "Jimmy" }, 
        { startTimestamp: 505050, name: "Kit" }
    ];
    
    const result = [ ...arr, ...arr2 ].filter((item, index, origin) => origin.filter((subItem) => subItem.startTimestamp === item.startTimestamp).length === 1);
    console.log(result);

    【讨论】:

    • 感谢您的有效评论。如果你有时间,你能帮我处理另一个用例吗?如果有重复,我只想保留其中一个。所以引用上面相同的数组数据。输出将是``` [ { startTimestamp: 1602675569525, name: "Pip" }, { startTimestamp: 1602664708822, name: "Jimmy" }, { startTimestamp: 1234, name: "Hero" }, { startTimestamp: 505050, name: “工具包”}]```谢谢
    • 每个数组上没有重复项?所以 arr1 本身没有重复的 startTimestamp 并且与 arr2 相同?
    • 无论如何,你可以这样做。 const val = [ ...arr, ...arr2 ].reduce((acc, cur) =&gt; { if (!acc[cur.startTimestamp]) { acc[cur.startTimestamp] = cur.name; } return acc; }, {}); console.log(Object.entries(val).map(([ startTimestamp, value ]) =&gt; ({ startTimestamp, ...value })));
    • 在我们合并 arr1 和 arr2 之后说。在这一点上,我们将在我的应用程序中重复发生这种情况。然后,我只想保留其中一个重复值并保留非重复值。
    • 以上将回答您的第二个问题。
    猜你喜欢
    • 1970-01-01
    • 2019-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 2018-09-08
    • 2019-01-05
    相关资源
    最近更新 更多