数组搜索对象数组 - Javascript

时间:2017-10-12 13:14:05

标签: javascript arrays

我有一个数组

var arr = ['0333', '0444', '0334'];

我有一系列物品。

var objArray = [{'name':'abc', 'phone':'0333'}, 
                {'name':'xyz', 'phone':'0334'},
                {'name':'fgfh', 'phone':'0999'},
                {'name':'abc', 'phone':'0666'},
                {'name':'abc', 'phone':'0444'} 
               ]

现在,我想在arr中搜索所有objArray值/索引,并使用匹配值分隔对象,并用分隔匹配值< /强>

var matchingArray = [];
var noMatchingArray = [];
for (var i = 0; i < arr.length; i++) {
        for (var j = 0; j < objArray.length; j++) {
            if(objArray[j]['phone'] == arr[i]){
                matchingArray.push(objArray);
             }
        }
}

如何向noMatchingArray添加匹配的对象?

4 个答案:

答案 0 :(得分:6)

这应该可以正常使用

objArray.forEach(item => arr.indexOf(item.phone) >=0 ? matchingArray.push(item) : noMatchingArray.push(item))

答案 1 :(得分:0)

您可以使用具有正常功能或MDN功能的Array.prototype.map()arrow

map()方法创建一个新数组,其结果是在调用数组中的每个元素上调用提供的函数。

没有ES6的Noraml地图

&#13;
&#13;
var arr = ['0333', '0444', '0334'],
    objArray = [{
            'name': 'abc',
            'phone': '0333'
        },{
            'name': 'xyz',
            'phone': '0334'
        },{
            'name': 'fgfh',
            'phone': '0999'
        },{
            'name': 'abc',
            'phone': '0666'
        },{
            'name': 'abc',
            'phone': '0444'
        }
    ];
var rec='',res = arr.map(function(val){
    rec = objArray.find(function(obj){return obj.phone == val});
    if (rec) {
        return rec;
    }
});
console.log(res);
&#13;
&#13;
&#13;

在ES6中

&#13;
&#13;
const arr = ['0333', '0444', '0334'],
    objArray = [{
            'name': 'abc',
            'phone': '0333'
        },{
            'name': 'xyz',
            'phone': '0334'
        },{
            'name': 'fgfh',
            'phone': '0999'
        },{
            'name': 'abc',
            'phone': '0666'
        },{
            'name': 'abc',
            'phone': '0444'
        }
    ];
let res = arr.map(val => {
    let rec = objArray.find(obj => obj.phone == val);
    if (rec) {
        return rec;
    }
});
console.log(res);
&#13;
&#13;
&#13;

答案 2 :(得分:-1)

首先,修改现有循环并添加break语句。如果我不误解你的匹配算法的目的,你想停止寻找这个电话号码的匹配,如果你已经匹配。

此外,我认为您的代码中存在错误。你不想在matchArray中推送objArray,对吗?只是匹配对象 - &gt; Ĵ

回答你的问题。我将使用第二个循环查看objArray中的所有对象,将那些不在数组matchingArray中的对象推送到noMatchingArray。

var matchingArray = [];
    var noMatchingArray = [];
    for (var i = 0; i < arr.length; i++) {
            for (var j = 0; j < objArray.length; j++) {
                if(objArray[j]['phone'] == arr[i]){
                    matchingArray.push(objArray[j]);
                    break;
                 }
            }
    }

   for (var j = 0; j < objArray.length; j++) {
       var marked = false;
       for (var i = 0; i < matchingArray.length; i++) {
           if (objArray[j] === matchingArray[i]) {
               marked = true;
               break;
           }
       }
       if(!marked){
           noMatchingArray.push(objArray[j]);
       }
   }

甚至更好:将两个循环组合在一起,同时切换初始算法的内部和外部外观使其比我的第一个解决方案更具可读性和更快速度。

var matchingArray = [];
var noMatchingArray = [];
for (var j = 0; j < objArray.length; j++) {
    var marked = false;
    for (var i = 0; i < arr.length; i++) {
            if(objArray[j]['phone'] == arr[i]){
                matchingArray.push(objArray[j]);
                marked = true;
                break;
             }
    }
    if(!marked){
       noMatchingArray.push(objArray[j]);
   }
}

答案 3 :(得分:-1)

function SearchArray() {
    var arr = ['0333', '0444', '0334'];
    var objArray = [{ 'name': 'abc', 'phone': '0333' },
    { 'name': 'fgfh', 'phone': '0999' },
    { 'name': 'abc', 'phone': '0666' },
    { 'name': 'abc', 'phone': '0444' }
    ];

    var matchingArray = [];
    var noMatchingArray = [];
    for (var i = 0; i < arr.length; i++) {
        var isFound = false;
        for (var j = 0; j < objArray.length; j++) {
            if (objArray[j]['phone'] == arr[i]) {
                matchingArray.push(objArray[j]);
                isFound = true;
                break;
            }
        }
        if (!isFound)
        {
            noMatchingArray.push(arr[i]);
        }
    }
}