Javascript - 在一个数组中拉出具有匹配属性的元素的值并保存到另一个数组

时间:2014-10-28 05:49:06

标签: javascript arrays

我有2个数组,sendInstalls和sendUsers。两个数组都有一个名为objId的属性,在两个数组中具有匹配值。数组不按任何特定顺序排序。

我想做什么:

  1. 对于sendUsers数组的每个元素,找到sendInstalls数组中具有匹配的objId属性的元素
  2. 在sendInstalls
  3. 中返回该元素的devToken属性值
  4. 将该属性的值保存在sendUsers数组的objToken属性中(已存在)
  5. 我尝试了以下内容:

                sendUsers.forEach(function(theSentUser){
    
                    function findWithAttr(array, attr, value){
                    for (var i = 0; i < array.length; i += 1){
                        if(array[i][attr] === value){
                            return i;
                            };
                        };
                    };
    
                    var matchInstall = findWithAttr(sendInstalls,'devToken',theSentUser.objId);
                    console.log(matchInstall);
                    theSentUser.objToken = sendInstalls[matchInstall].devToken;
                });
    

    然而,console.log(matchInstall)行返回'undefined'行而不是匹配数组索引。

    没有粘贴数据,因为它是用户敏感的,但是上面有什么问题吗?如果数据对解决这个问题至关重要,我可以尝试匿名摘录并更新这个问题。

    非常感谢任何帮助。

    干杯

2 个答案:

答案 0 :(得分:0)

现在你没有在你的问题中提到你的数组的结构,但假设你已经正确定义和编码,你可能只需要在遍历{{}的循环外定义函数findwithAttr。 1}}数组如此(未经测试的代码):

SendUsers

您在循环中定义并使用了可能导致问题的功能。我希望这能让你开始朝着正确的方向前进。

答案 1 :(得分:0)

首先感谢Vivek的快速反应。

根据我对Vivek的回答的评论,主要问题是'devToken'是与theSentUser.objId比较的错误键,所以它总是以未定义的形式出现。愚蠢的错误,道歉并且不可能让Vivek不知道阵列的结构。

我还需要为matchInstall引入一些错误处理。

以下代码可以帮助其他人尝试实现类似的功能。

    function findWithAttr(array, attr, value){
                for (var i = 0; i < array.length; i += 1){
                    if(array[i][attr] === value){
                        return i;
                        };
                    };
                };

    sendUsers.forEach(function(theSentUser){

                var matchInstall = findWithAttr(sendInstalls,'usrId',theSentUser.objId);

                if(typeof (matchInstall) === "undefined"){
                    theSentUser.objToken = 0
                    console.log('error')
                } else {
                    theSentUser.objToken = sendInstalls[matchInstall]['devToken']
                    console.log(theSentUser.objToken)
                }; 
            });