在javascript

时间:2015-07-01 18:34:49

标签: javascript arrays

我会直言不讳。我有两个数组:

fruits = ["Banana", "Apple"];
fruitsSpecified = ["Big Banana", "Banana Small", "Black Apple", "Big Orange"];

我正在寻找的结果:

newArray = ["Big Banana", "Banana Small", "Black Apple"];

所以我想检查fruitsSpecified字符串是否包含fruits的一部分,并将这些结果放入新数组中。我怎么做?我找到的所有答案都过于复杂,仅查看完全匹配(例如" Apple"阵列#1和#34; Apple"阵列#2)。

到目前为止,我有这个:

function testFunction() {
    newArray = [];
    for (i = 0; i < fruitsSpecified.length; i++) {
        myResult = fruitsSpecified.indexOf(fruits[i]);
        newArray.push(myResult);
    }
    console.log(newArray);
}

这显然不起作用,因为它只找到完全匹配。

我已经检查了这些问题(但发现它们太复杂了,我相信/希望有一个更简单的解决方案):
Best way to find if an item is in a JavaScript array?
How do I check if an array includes an object in JavaScript?

谢谢!

3 个答案:

答案 0 :(得分:4)

您可以循环第一个数组,看看第二个数组的每个元素是否包含第一个数组的当前元素:

function testFunction() {
    var newArray = [];
    for (var i = 0; i < fruits.length; i++) {
        for(var j = 0; j < fruitsSpecified.length; j++)
        {
            if(fruitsSpecified[j].indexOf(fruits[i]) != -1)
            {
                newArray.push(fruitsSpecified[j]);
            }
        }
    }
    console.log(newArray);
}

控制台输出:

["Big Banana", "Banana Small", "Black Apple"]

如果您愿意,可以通过将数组作为参数传递来使其更通用:

 function testFunction(fruits, fruitsSpecified) {
    var newArray = [];
    for (var i = 0; i < fruits.length; i++) {
        for(var j = 0; j < fruitsSpecified.length; j++)
        {
            if(fruitsSpecified[j].indexOf(fruits[i]) != -1)
            {
                newArray.push(fruitsSpecified[j]);
            }
        }
    }
    console.log(newArray);
    return newArray;
}

您可以这样称呼它:

var fruits = ["Banana", "Apple"];
var fruitsSpecified = ["Big Banana", "Banana Small", "Black Apple", "Big Orange"];
var newArray = testFunction(fruits, fruitsSpecified);
console.log(newArray);

答案 1 :(得分:3)

使用.filter().some().indexOf()非常简单。

var result = fruitsSpecified.filter(function(fs) {
    return fruits.some(function(ff) { return fs.indexOf(ff) > -1 });
});

var fruits = ["Banana", "Apple"];
var fruitsSpecified = ["Big Banana", "Banana Small", "Black Apple", "Big Orange"];

var result = fruitsSpecified.filter(function(fs) {
    return fruits.some(function(ff) { return fs.indexOf(ff) > -1 });
});

document.body.innerHTML = "<pre>" + JSON.stringify(result, null, 2) + "</pre>";

答案 2 :(得分:0)

在现代浏览器和NodeJS上,您可以使用filter使用someindexOf来测试fruitsSpecified数组项。这里的主要好处是,您可以遍历数组以仅搜索一次,然后如果搜索条件与其余搜索项匹配则跳过该搜索循环。

var fruits = ["Banana", "Apple"];
var fruitsSpecified = ["Big Banana", "Banana Small", "Black Apple", "Big Orange"];

function testFunction(arr, searchArr) {
  return arr.filter(function(item) {
    return searchArr.some(function(searchTerm) {
      return item.indexOf(searchTerm) > -1;
    });
  });
}

var newArray = testFunction(fruitsSpecified, fruits);
document.write('<pre>' + JSON.stringify(newArray) + '</pre>');