2017-05-26 96 views
0

我有一个对象数组,我需要在数组中找到它们的位置,其中关键ecommerce_order_number值与搜索的数字相匹配。返回具有与搜索条件相匹配的关键字的数组的所有索引

我试着做一个for循环,但我可以看到,这不是一个好主意,因为可能有500 +检查即时对阵数字我有这是单独的。

通常我会循环,并获得所有的比赛,并继续离开那里。但林希望有一个更清洁的方法使用香草的JavaScript。

var myTransactions = []; 
myTransactions[0].order = 'S17243'; 


for(i=0; i < myTransactions.length; i++) 
{ 
// 
} 

但我可以看到我的循环将仅限于事务计数的数量,如果比这确实发生了交易的数量有更多的支付,我将无法获得的各项指标付款数组匹配。

是否有一个函数可以搜索一个对象数组并返回找到的所有键的索引以匹配一个特定的字符串?

var payments= [{ 
     "id": "11419", 
     "recordtype": "payment", 
     "cols": { 
      "entity": { 
       "name": "Angela smith", 
       "id": "6641" 
      }, 
      "account": { 
       "name": "test-data", 
       "id": "335" 
      }, 
      "amount": 3810.2, 
      "ecommerce_order_number": "S17247", 
      "datecreated": "10/4/2017 5:42 PM" 
     } 
    }, { 
     "id": "11420", 
     "recordtype": "payment", 
     "cols": { 
      "entity": { 
       "name": "Paul Georgeson", 
       "id": "6640" 
      }, 
      "account": { 
       "name": "test-data", 
       "id": "335" 
      }, 
      "amount": 3539, 
      "ecommerce_order_number": "S17223", 
      "datecreated": "10/4/2017 5:42 PM" 
     } 
    }, { 
     "id": "11421", 
     "recordtype": "payment", 
     "cols": { 
      "entity": { 
       "name": "Leanne Smithy", 
       "id": "6638" 
      }, 
      "account": { 
       "name": "test-data", 
       "id": "336" 
      }, 
      "amount": 1617.2, 
      "ecommerce_order_number": "S17243", 
      "datecreated": "10/4/2017 5:42 PM" 
     } 
    }]; 
+0

变种IDS = array.reduce((ARR,EL,I)=>(el.sth ===真&& arr.push(i))的|| ARR,[]) –

回答

0
var payments= [{ 
    "id": "11419", 
    "recordtype": "payment", 
    "cols": { 
     "entity": { 
      "name": "Angela smith", 
      "id": "6641" 
     }, 
     "account": { 
      "name": "test-data", 
      "id": "335" 
     }, 
     "amount": 3810.2, 
     "ecommerce_order_number": "S17247", 
     "datecreated": "10/4/2017 5:42 PM" 
    } 
}, { 
    "id": "11420", 
    "recordtype": "payment", 
    "cols": { 
     "entity": { 
      "name": "Paul Georgeson", 
      "id": "6640" 
     }, 
     "account": { 
      "name": "test-data", 
      "id": "335" 
     }, 
     "amount": 3539, 
     "ecommerce_order_number": "S17223", 
     "datecreated": "10/4/2017 5:42 PM" 
    } 
}, { 
    "id": "11421", 
    "recordtype": "payment", 
    "cols": { 
     "entity": { 
      "name": "Leanne Smithy", 
      "id": "6638" 
     }, 
     "account": { 
      "name": "test-data", 
      "id": "336" 
     }, 
     "amount": 1617.2, 
     "ecommerce_order_number": "S17243", 
     "datecreated": "10/4/2017 5:42 PM" 
    } 
}]; 


var ids=payments.reduce((arr,el,i)=>(el.cols&&el.cols.ecommerce_order_number.includes("S17243")&&!arr.push(i))||a‌​rr,[]); 

你可以使用Array.prototype.reduce方法...

长篇:

var ids=payments.reduce((arr,el,i)=>{ 
if(el.cols&&el.cols.ecommerce_order_number.includes("S17243")) arr.push(i); 
return arr; 
},[]); 

http://jsbin.com/jucexilude/edit?console

0

我也有类似的情况,我做到了使用Array.map

var payments= [{ 
     "id": "11419", 
     "recordtype": "payment", 
     "cols": { 
      "entity": { 
       "name": "Angela smith", 
       "id": "6641" 
      }, 
      "account": { 
       "name": "test-data", 
       "id": "335" 
      }, 
      "amount": 3810.2, 
      "ecommerce_order_number": "S17247", 
      "datecreated": "10/4/2017 5:42 PM" 
     } 
    }, { 
     "id": "11420", 
     "recordtype": "payment", 
     "cols": { 
      "entity": { 
       "name": "Paul Georgeson", 
       "id": "6640" 
      }, 
      "account": { 
       "name": "test-data", 
       "id": "335" 
      }, 
      "amount": 3539, 
      "ecommerce_order_number": "S17223", 
      "datecreated": "10/4/2017 5:42 PM" 
     } 
    }, { 
     "id": "11421", 
     "recordtype": "payment", 
     "cols": { 
      "entity": { 
       "name": "Leanne Smithy", 
       "id": "6638" 
      }, 
      "account": { 
       "name": "test-data", 
       "id": "336" 
      }, 
      "amount": 1617.2, 
      "ecommerce_order_number": "S17243", 
      "datecreated": "10/4/2017 5:42 PM" 
     } 
    }]; 

var arrOfIndexes = payments.map((payment, index, completeArr) => { 
         if(payment.cols.ecommerce_order_number === "S17243") { 
          return index; 
         } else { return null } 
        }).filter(Boolean); // filter used to remove falsey values 
console.log(arrOfIndexes); 
0

您可以使用jQuery grep功能,以便与特定的属性值来检索所有的对象,那么你可以,如果你需要得到只有ID,请参见下面请:

获取所有的与ecommerce_order_number = “S17243” 对象:

var filteredObj = $.grep(payments, function(obj) { 
    return obj.cols.ecommerce_order_number === "S17243"; 
}); 

获取仅上述目的的ID:

var onlyIds = filteredObj.map(function(obj) {return obj.id;}); 

合并在一个行指令上述代码:

var oneLineObj = $.grep(payments, function(obj) { 
    return obj.cols.ecommerce_order_number === "S17243"; 
}).map(function(obj) {return obj.id;}); 

参见下面的示例请:

var payments= [{ 
 
     "id": "11419", 
 
     "recordtype": "payment", 
 
     "cols": { 
 
      "entity": { 
 
       "name": "Angela smith", 
 
       "id": "6641" 
 
      }, 
 
      "account": { 
 
       "name": "test-data", 
 
       "id": "335" 
 
      }, 
 
      "amount": 3810.2, 
 
      "ecommerce_order_number": "S17247", 
 
      "datecreated": "10/4/2017 5:42 PM" 
 
     } 
 
    }, { 
 
     "id": "11420", 
 
     "recordtype": "payment", 
 
     "cols": { 
 
      "entity": { 
 
       "name": "Paul Georgeson", 
 
       "id": "6640" 
 
      }, 
 
      "account": { 
 
       "name": "test-data", 
 
       "id": "335" 
 
      }, 
 
      "amount": 3539, 
 
      "ecommerce_order_number": "S17223", 
 
      "datecreated": "10/4/2017 5:42 PM" 
 
     } 
 
    }, { 
 
     "id": "11421", 
 
     "recordtype": "payment", 
 
     "cols": { 
 
      "entity": { 
 
       "name": "Leanne Smithy", 
 
       "id": "6638" 
 
      }, 
 
      "account": { 
 
       "name": "test-data", 
 
       "id": "336" 
 
      }, 
 
      "amount": 1617.2, 
 
      "ecommerce_order_number": "S17243", 
 
      "datecreated": "10/4/2017 5:42 PM" 
 
     } 
 
    }, { 
 
     "id": "test", 
 
     "recordtype": "payment", 
 
     "cols": { 
 
      "entity": { 
 
       "name": "Alessandro", 
 
       "id": "1" 
 
      }, 
 
      "account": { 
 
       "name": "test-data", 
 
       "id": "336" 
 
      }, 
 
      "amount": 5000.2, 
 
      "ecommerce_order_number": "S17243", 
 
      "datecreated": "18/5/2017 5:42 PM" 
 
     } 
 
    }]; 
 

 

 
var filteredObj = $.grep(payments, function(obj) { 
 
    return obj.cols.ecommerce_order_number === "S17243"; 
 
}); 
 

 
var onlyIds = filteredObj.map(function(obj) {return obj.id;}); 
 

 
console.log("IDS: ", onlyIds); 
 
console.log("COMPLETE OBJECTS: ", filteredObj); 
 

 
var oneLineObj = $.grep(payments, function(obj) { 
 
    return obj.cols.ecommerce_order_number === "S17243"; 
 
}).map(function(obj) {return obj.id;}); 
 

 
console.log(oneLineObj);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

0

纯javascri点,没有jQuery的解决方案。

您可以使用新的阵列助手:.filter.find


.filter解决方案如果你希望有一个以上的结果。

const resultFiler = payments.filter(payment => { 
    if (payment.cols.ecommerce_order_number === searchValue) { 
    return payment; 
    } 
}).map(payment => payment.id); 

.filter助手只返回完整的数组元素。我们无法做到像return payment.id这样的事情,因为我们只关心.id财产。我们用.map(payment => payment.id);


.find解决方案,如果你希望只有一个结果。

const resultFind = payments.find(payment => { 
    if (payment.cols.ecommerce_order_number === searchValue) { 
    return payment; 
    } 
}).id; 

如果你不熟悉的脂肪箭头/ ES6语法这里是等效代码:

var resultFiler = payments.filter(function (payment) { 
    if (payment.cols.ecommerce_order_number === searchValue) { 
    return payment; 
    } 
}).map(function (payment) { 
    return payment.id; 
}); 

// Using find 
var resultFind = payments.find(function (payment) { 
    if (payment.cols.ecommerce_order_number === searchValue) { 
    return payment; 
    } 
}).id; 

见工作示例。

var payments= [{ 
 
     "id": "11419", 
 
     "recordtype": "payment", 
 
     "cols": { 
 
      "entity": { 
 
       "name": "Angela smith", 
 
       "id": "6641" 
 
      }, 
 
      "account": { 
 
       "name": "test-data", 
 
       "id": "335" 
 
      }, 
 
      "amount": 3810.2, 
 
      "ecommerce_order_number": "S17247", 
 
      "datecreated": "10/4/2017 5:42 PM" 
 
     } 
 
    }, { 
 
     "id": "11420", 
 
     "recordtype": "payment", 
 
     "cols": { 
 
      "entity": { 
 
       "name": "Paul Georgeson", 
 
       "id": "6640" 
 
      }, 
 
      "account": { 
 
       "name": "test-data", 
 
       "id": "335" 
 
      }, 
 
      "amount": 3539, 
 
      "ecommerce_order_number": "S17223", 
 
      "datecreated": "10/4/2017 5:42 PM" 
 
     } 
 
    }, { 
 
     "id": "11421", 
 
     "recordtype": "payment", 
 
     "cols": { 
 
      "entity": { 
 
       "name": "Leanne Smithy", 
 
       "id": "6638" 
 
      }, 
 
      "account": { 
 
       "name": "test-data", 
 
       "id": "336" 
 
      }, 
 
      "amount": 1617.2, 
 
      "ecommerce_order_number": "S17243", 
 
      "datecreated": "10/4/2017 5:42 PM" 
 
     } 
 
    }]; 
 
    
 
const searchValue = "S17243" 
 
// Find all matching occurrences 
 
    
 
const resultFiler = payments.filter(payment => { 
 
    if (payment.cols.ecommerce_order_number === searchValue) { 
 
    return payment; 
 
    } 
 
}).map(payment => payment.id); 
 

 

 
// Using find 
 
const resultFind = payments.find(payment => { 
 
    if (payment.cols.ecommerce_order_number === searchValue) { 
 
    return payment; 
 
    } 
 
}).id; 
 

 
console.log(resultFiler); 
 
console.log(resultFind);

相关问题