我有這個陣列:
let productKeys = [ "aff_link", "availability", "brand", "date_add", "date_upd", "description", "image_link", "link", "price", "product_type", "title" ];
另一個陣列稱為preDefinedHeader:
let preDefinedHeader = ['image_link', 'title', 'price', 'brand', 'link'];
現在,我想僅當陣列中存在任何鍵時才productKeys根據陣列鍵順序對陣列進行排序。preDefinedHeaderpreDefinedHeaderproductKeys
所以輸出應該是現在;
['image_link', 'title', 'price', 'brand', 'link', 'aff_link', 'availability', 'description', 'date_add', 'date_upd', 'product_type'];
我知道如何正常排序是這樣的:
productKeys.sort()
但不知道如何按我想要的方式排序。請幫我。
uj5u.com熱心網友回復:
您可以使用建議鏈接中的代碼作為開始,但您需要考慮以下事實,即 in 中的某些值productKeys不在preDefinedHeader. a發生這種情況時,您希望將這些值排序到串列的末尾,因此如果未找到 ( productKeys.indexOf(a) == -1),則需要回傳正數,如果b未找到,或者a.localeCompare(b)兩者都未找到,則需要回傳負數。否則,您將根據indexOf值進行排序。該功能可以如下實作:
let productKeys = ["aff_link", "availability", "brand", "date_add", "date_upd", "description", "image_link", "link", "price", "product_type"];
let preDefinedHeader = ['image_link', 'title', 'price', 'brand', 'link'];
productKeys.sort((a, b) => {
let ia = preDefinedHeader.indexOf(a)
let ib = preDefinedHeader.indexOf(b)
if (ia == -1) {
if (ib == -1) return a.localeCompare(b)
return 1
}
else if (ib == -1) {
return -1
}
return ia - ib
});
console.log(productKeys)
uj5u.com熱心網友回復:
您可以按索引或大值排序,以將其他專案保持在同一位置。
const
getOrder = s => preDefinedHeader.indexOf(s) 1 || Number.MAX_VALUE,
productKeys = [ "aff_link", "availability", "brand", "date_add", "date_upd", "description", "image_link", "link", "price", "product_type", "title" ],
preDefinedHeader = ['image_link', 'title', 'price', 'brand', 'link'];
productKeys.sort((a, b) => getOrder(a) - getOrder(b));
console.log(productKeys);
uj5u.com熱心網友回復:
let productKeys = [ "aff_link", "availability", "brand", "date_add", "date_upd", "description", "image_link", "link", "price", "product_type", "title" ];
let preDefinedHeader = ['image_link', 'title', 'price', 'brand', 'link'];
const productKeySet = new Set(productKeys);
const output = []
for (const item of preDefinedHeader) {
if(productKeySet.has(item)) {
output.push(item)
productKeySet.delete(item)
}
}
let arrayWithProperOrder = [...output,...productKeySet]
你可以做這樣的事情。不確定它是否是最有效的方法。
uj5u.com熱心網友回復:
我使用 filter()、includes()、sort()、concat()。如果不需要在 filter() 之后對陣列進行排序,則可以省略 sort()。
let productKeys = [ "aff_link", "availability", "brand", "date_add", "date_upd", "description", "image_link", "link", "price", "product_type", "title" ];
let preDefinedHeader = ['image_link', 'title', 'price', 'brand', 'link', 'test'];
let newPreDefinedHeader = preDefinedHeader.filter(e => productKeys.includes(e));
console.log(newPreDefinedHeader);
let filteredArr = productKeys.filter(e => !newPreDefinedHeader.includes(e));
let arr = newPreDefinedHeader.concat(filteredArr.sort((a, b) => a - b));
console.log(arr);
// ["image_link", "title", "price", "brand", "link", "aff_link", "availability", "date_add", "date_upd", "description", "product_type"]
uj5u.com熱心網友回復:
這是我的看法:
let productKeys = [ "aff_link", "availability", "brand", "date_add", "date_upd", "description", "image_link", "link", "prices", "product_type", "brand", "title" ];
let ord = ['image_link', 'title', 'price', 'brand', 'link'];
// val returns a numeric string ("000"..."004") if contained in ord, otherwise the original string
const val=e=>{let i=ord.indexOf(e); return i>-1?(1000 i).toFixed(0).slice(1):e; }
console.log("comparison values:",productKeys.map(e=>`${e} => ${val(e)}`)); // shows the comparison values for productKeys
const res=productKeys.sort((a,b)=>val(a).localeCompare(val(b)));
console.log("sorted array:",res)
我修改了示例資料以演示更多的邊緣情況:
price是現在prices(因此并非所有predefinedHeader值現在都在producKeys陣列中可用brand出現兩次(也將在結果陣列中出現兩次)
當陣列中有其他數字字串時,我的方法將失敗,productKeys因為它們的處理方式與ord.
相比之下,@Nick 的方法更可靠——這里又是他的版本,使用三元運算子:
let productKeys = [ "aff_link", "availability", "brand", "date_add", "date_upd", "description", "image_link", "link", "prices", "product_type", "brand", "title" ];
let ord = ['image_link', 'title', 'price', 'brand', 'link'];
const res=productKeys.sort((a, b) => { // Nick's approach (see above) with ternary operator:
const ia = ord.indexOf(a), ib = ord.indexOf(b);
return ia==-1
? ib==-1
? a.localeCompare(b)
: 1
: ib==-1
? -1
: ia - ib
});
console.log(res)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/514921.html
標籤:javascript数组
上一篇:匹配兩個值并從多維陣列中取消設定
下一篇:變數的值沒有更新,它是1或0
