我有一個陣列
let names = ['Devid', 'Aries','James'];
和一個物件陣列
let details = [
{"Name":"John"},
{"Name":"Devid"},
{"Name":"Aries"},
{"Name":"Aries"}
];
我想詳細檢查所有名稱是否存在,它們在 1 個回圈中也不是按名稱重復的
let names = ['Devid', 'Aries','James'];
let details = [
{"Name":"John"},
{"Name":"Devid"},
{"Name":"Aries"},
{"Name":"Aries"}
];
let count = 0;
for (var eachDetail of details) {
// checking here Name exist
let isNameFound = names.some(el => eachDetail.Name.includes(el));
if (isNameFound) count ;
}
console.log(count);
// console.log(3) expected output 2
輸出應為 2(如 Devid 和 Aries)存在
uj5u.com熱心網友回復:
您可以簡單地遍歷names陣列并執行details.find(...)操作。如果您在 中找到該物件details,請將其添加到結果串列中。
let names = ['Devid', 'Aries','James'];
let details = [
{"Name":"John"},
{"Name":"Devid"},
{"Name":"Aries"},
{"Name":"Aries"}
];
let result = [];
names.forEach(name => {
const object = details.find(detail => detail.Name === name);
if (object) {
result.push(object);
}
});
console.log(result.length ' entries found:');
console.log(JSON.stringify(result, null, 2));
uj5u.com熱心網友回復:
您可以使用reduce來計算陣列中可以在物件值中找到的元素。您可以使用 aSet洗掉重復項。
let names = ['Devid', 'Aries','James'];
let details = [
{"Name":"John"},
{"Name":"Devid"},
{"Name":"Aries"},
{"Name":"Aries"}
];
const detailsNames = [...new Set(details.map(d => d.Name))];
const count = [...new Set(names)].reduce((acc, el) => acc detailsNames.includes(el), 0);
console.log(count);
uj5u.com熱心網友回復:
您應該能夠使用.filter()、.some()和.inlcude()內部驗證非重復項的方法來過濾陣列。
請在此處查看有關 JS 陣列方法的檔案:https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array
let names = ['Devid', 'Aries','James'];
let tempNames = [];
let details = [
{"Name":"John"},
{"Name":"Devid"},
{"Name":"Aries"},
{"Name":"Aries"}
];
var newDetails = details.filter(x => {
let includeName = names.some(j => j == x.Name) && !tempNames.includes(x.Name);
tempNames.push(x.Name);
return includeName;
});
console.log(newDetails);
uj5u.com熱心網友回復:
您可以原型陣列,然后遍歷名稱陣列
Array.prototype._indexOfName = function(name){
let n = 0;
for(; n < this.length; n )
if(this[n].Name == name)
return n
return -1
};
let names = ['Devid', 'Aries','James'];
let details = [
{"Name":"John","Age":20},
{"Name":"Devid","Age":23},
{"Name":"Aries","Age":34},
{"Name":"Aries","Age":50}
];
let n = 0;
let n2 = 0;
for(; n < names.length; n )
if(details._indexOfName(names[n]) > -1)
n2
alert('Found ' n2 ' matches')
uj5u.com熱心網友回復:
這里有兩個解決方案filter()的names基礎上在存在陣列details。然后檢索過濾后陣列的長度。
檢查名稱是否存在的一種details方法是使用some(). 回傳true只要回呼的回傳值是truthy。
另一種方法是將 的所有名稱details放在Set第一個中。這允許您將過濾器回呼簡化為name => detailNames.has(name).
const names = ["Devid", "Aries", "James"];
const details = [
{ "Name": "John" },
{ "Name": "Devid" },
{ "Name": "Aries" },
{ "Name": "Aries" },
];
// solution #1
const count1 = names.filter((name) => (
details.some(detail => detail.Name == name)
)).length;
console.log(count1);
// solution #2
const detailNames = new Set(details.map(detail => detail.Name));
const count2 = names.filter(name => detailNames.has(name)).length;
console.log(count2);
兩種解決方案都假定names不包含重復名稱。
如果details小,第一個解決方案很可能更快。第二種解決方案有更多的開銷,但如果details很大,則速度更快。這是因為some()從開始到結束搜索專案開始迭代,同時has()使用查找演算法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/315811.html
標籤:javascript 节点.js 数组 目的
