通过引用另一个数组过滤Javascript子数组元素

时间:2018-10-11 16:42:29

标签: javascript arrays filter

我有两个数组:mainArray和allowedArray。数组具有以下格式:

启动数组

mainArray

Array(18) [ "Bill", "AGLUK", "JAW", … ]
Array(18) [ "Bill", "AKI", "MONEY", … ]
Array(18) [ "Tom", "AGLUK", "JAW", … ]
Array(18) [ "Tom", "AKI", "MONEY", … ]
Array(18) [ "Cathy", "AGLUK", "JAW", … ]
Array(18) [ "Cathy", "AKI", "MONEY", … ]

allowedArray

Array(2) [ "Tom", "Cathy" ]

所需的输出

goodArray

Array(18) [ "Tom", "AGLUK", "JAW", … ]
Array(18) [ "Tom", "AKI", "MONEY", … ]
Array(18) [ "Cathy", "AGLUK", "JAW", … ]
Array(18) [ "Cathy", "AKI", "MONEY", … ]

badArray

Array(18) [ "Bill", "AGLUK", "JAW", … ]
Array(18) [ "Bill", "AKI", "MONEY", … ]

我尝试了各种代码,但都失败了:

mainArray.forEach(function(line) {
     allowedArray.forEach(function(ID) {
       if (line[0] == ID[0]) {
       goodArray.push(line);
     }
   });
});

问题:goodArray始终为空

3 个答案:

答案 0 :(得分:0)

您可以只使用some方法。 (请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some)。

var answer = mainArray.some(a => allowedArray.indexOf(a) != -1) ? mainArray : [];

如果允许将其保留在其中,则将保留整个mainArray。

编辑:将“任意”替换为“某些”。

答案 1 :(得分:0)

如果我们将问题翻译成英文,我们会得到这样的东西:

对于mainArray中的每个项目,检查其索引0的值是否存在于allowedArray中。如果是这样,请将项目添加到goodArray,否则将项目添加到badArray

这几乎可以从字面上翻译回javascript:

const mainArray = [
    [ "Bill", "AGLUK", "JAW"],
    [ "Bill", "AKI", "MONEY"],
    [ "Tom", "AGLUK", "JAW"],
    [ "Tom", "AKI", "MONEY"],
    [ "Cathy", "AGLUK", "JAW"],
    [ "Cathy", "AKI", "MONEY"],
];

const allowedArray = ["Tom", "Cathy"];

const goodArray = [];
const badArray = [];

// For each item in mainArray..
mainArray.forEach(function(item) {

    // check if the value for index 0 is present in allowedArray. 
    // If so...
    if (allowedArray.indexOf(item[0]) !== -1) {
        // add the item to goodArray,
        goodArray.push(item);
    // otherwise...
    } else {
        // add the item to badArray
        badArray.push(item);
    }
});

console.log({ goodArray, badArray });
.as-console-wrapper {
  max-height: 100% !important;
  height: auto;
}

如果缩短一点,并且没有注释,它可能看起来像这样:

mainArray.forEach((record) => allowedArray.indexOf(record[0]) !== -1
    ? goodArray.push(record)
    : badArray.push(record));

答案 2 :(得分:-1)

您可以使用一个辅助对象,并将检查数组作为对应数组的键。

var array = [["Bill", "AGLUK", "JAW"], [ "Bill", "AKI", "MONEY"], [ "Tom", "AGLUK", "JAW"], [ "Tom", "AKI", "MONEY"], [ "Cathy", "AGLUK", "JAW"], [ "Cathy", "AKI", "MONEY"]],
    allowedArray = ["Tom", "Cathy"],
    good = [],
    bad = [],
    temp = { true: good, false: bad };
    
array.forEach(function(line) {
    temp[allowedArray.indexOf(line[0]) !== -1].push(line);
});

console.log(good);
console.log(bad);
.as-console-wrapper { max-height: 100% !important; top: 0; }

使用更新的ES,Array#includes会更短。

var array = [["Bill", "AGLUK", "JAW"], [ "Bill", "AKI", "MONEY"], [ "Tom", "AGLUK", "JAW"], [ "Tom", "AKI", "MONEY"], [ "Cathy", "AGLUK", "JAW"], [ "Cathy", "AKI", "MONEY"]],
    allowedArray = ["Tom", "Cathy"],
    good = [],
    bad = [],
    temp = { true: good, false: bad };
    
array.forEach(line => temp[allowedArray.includes(line[0])].push(line));

console.log(good);
console.log(bad);
.as-console-wrapper { max-height: 100% !important; top: 0; }