改变。通过基于索引数组进行过滤来实现数组中的可见属性

时间:2018-12-21 19:59:04

标签: javascript arrays

需要通过使array2中不存在的索引可见false来从array1创建新的array3。

在下面的示例中,我的索引为0,2。因此,结果数组必须在1,3可见为false

list_links = ['google/order', 'google/faq', 'google/404']
prefixes = ['order', '404']
new_result = [i for i in list_links if all(not i.endswith(c) for c in prefixes)]

预期结果:

['google/faq']

2 个答案:

答案 0 :(得分:4)

一个选项可能是在array1上使用map,在array2上使用includes。在map内,创建原始对象的副本,以便array1中的原始对象不会发生突变。

var array1 = [{
  "visible": "true",
  "id": 0
}, {
  "visible": "true",
  "id": 1
}, {
  "visible": "true",
  "id": 2
}, {
  "visible": "true",
  "id": 3
}];

var array2 = [0, 2];

var array3 = array1.map(i => {
  var dc = JSON.parse(JSON.stringify(i));
  dc.visible = array2.includes(i.id).toString();
  return dc;
});


console.log(array3);
console.log(array1);

答案 1 :(得分:0)

您可以将array2转换为Set以保持恒定的查找时间:

function hide(array1, array2) {
    const indexes = new Set(array2);
    return array1.map(o => !indexes.has(o.id) ? ({...o, visible: "false" }) : o);
}

var array1 = [{
  "visible": "true",
  "id": 0
}, {
  "visible": "true",
  "id": 1
}, {
  "visible": "true",
  "id": 2
}, {
  "visible": "true",
  "id": 3
}];

console.log(hide(array1, [0, 2]));

这只会执行要求的操作:将visible转到"false",其中id未列出。它不会做相反的事情,即当列出visible 时,它不会将"true"变成id:它将仅复制原始设置。

如果也应该发生相反的情况,则visible的原始值将不再起作用:

function hide(array1, array2) {
    const indexes = new Set(array2);
    return array1.map(o => ({...o, visible: indexes.has(o.id)+"" }));
}

var array1 = [{
  "visible": "true",
  "id": 0
}, {
  "visible": "true",
  "id": 1
}, {
  "visible": "true",
  "id": 2
}, {
  "visible": "true",
  "id": 3
}];

console.log(hide(array1, [0, 2]));

请注意,如果visible是布尔值而不是字符串(falsetrue而不是"false""true",则更有意义。