使用过滤器时如何设置条件?

ter*_*res 5 javascript jquery

我试图在以下数组中返回破坏关系的所有项目:

[
   { id: "1", option: { bound_id: "2" }},
   { id: "2", option: { bound_id: "12" }},
   { id: "12", option: { bound_id: "2" }}
]
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,每个项目都使用该属性相互链接bound_id,如果属性破坏了以下关系:

[
   { id: "1", option: { bound_id: null }},
   { id: "2", option: { bound_id: "12" }},
   { id: "12", option: { bound_id: "2" }}
]
Run Code Online (Sandbox Code Playgroud)

返回以下结果:

[
   { id: "2", option: { bound_id: "12" }}
   { id: "12", option: { bound_id: "2" }}
]
Run Code Online (Sandbox Code Playgroud)

我正在使用以下代码:

const input = [
   { id: "1", option: { bound_id: null }},
   { id: "2", option: { bound_id: "12" }},
   { id: "12", option: { bound_id: "2" }}
];

const output = input.filter(a => a.option.bound_id);

console.log(output);
Run Code Online (Sandbox Code Playgroud)

我想要包括的是只插入下一个项目的关系,一个例子更好:

[
   { id: "1", option: { bound_id: "2" }},
   { id: "2", option: { bound_id: "3" }},
   { id: "12", option: { bound_id: "2" }}
]
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,带有id的项2打破了与id 的关系,12并指向了一个id 3不存在于集合中的项,在这种情况下输出应该是:

[
   { id: "1", option: { bound_id: "2" }},
   { id: "2", option: { bound_id: "3" }}
]
Run Code Online (Sandbox Code Playgroud)

我怎么能用过滤器呢?

Cer*_*nce 4

在使用 时.filter,您可以添加到sSet中的a id,以及正在迭代的.filter是否bound_id包含在 Yet 中Set(如果不包含,则将其添加到集合中;如果包含,则让该项目无法通过测试.filter)。如果索引为 0,也保留该项目,因为您总是希望保留第一条记录:

const input = [
   { id: "1", option: { bound_id: "2" }},
   { id: "2", option: { bound_id: "3" }},
   { id: "12", option: { bound_id: "2" }}
];
const alreadyHave = new Set();
const filtered = input.filter(({ option }, index) => {
  const { bound_id } = option;
  if (!alreadyHave.has(bound_id) || index === 0) {
    alreadyHave.add(bound_id);
    return true;
  }
});
console.log(filtered);
Run Code Online (Sandbox Code Playgroud)

如果根据评论,您实际上希望始终删除第一项,则将条件更改为&& index !== 0

const input = [
   { id: "1", option: { bound_id: "2" }},
   { id: "2", option: { bound_id: "3" }},
   { id: "12", option: { bound_id: "2" }}
];
const alreadyHave = new Set();
const filtered = input.filter(({ option }, index) => {
  const { bound_id } = option;
  if (!alreadyHave.has(bound_id) && index !== 0) {
    alreadyHave.add(bound_id);
    return true;
  }
});
console.log(filtered);
Run Code Online (Sandbox Code Playgroud)

或者,根据评论,如果第一项的逻辑应该相同,则index完全删除条件:

const input = [
   { id: "1", option: { bound_id: "2" }},
   { id: "2", option: { bound_id: "3" }},
   { id: "12", option: { bound_id: "2" }}
];
const alreadyHave = new Set();
const filtered = input.filter(({ option }, index) => {
  const { bound_id } = option;
  if (!alreadyHave.has(bound_id)) {
    alreadyHave.add(bound_id);
    return true;
  }
});
console.log(filtered);
Run Code Online (Sandbox Code Playgroud)