簡體   English   中英

如何根據所包含屬性的首字母過濾數組?

[英]How can I filter an array based on the first letter of a contained property?

我有以下對象的JavaScript數組:

[{name: '4 Arn', isLetter: false},
{name: 'Abax', isLetter: false},
{name: 'Aramex', isLetter: false},
{name: 'Booking', isLetter: false},
{name: 'Dangerous', isLetter: false},
{name: 'Manali', isLetter: false}]

在上面的數組中,我想檢查每個項目的name屬性的首字母。 如果匹配,我想在對象之前追加一個新對象,如以下示例所示:

[{letter: "#", isLetter: true},       // new object 
{name: '4 Arn', isLetter: false},
{letter: "A", isLetter: true},        // new Object
{name: 'Abax', isLetter: false},
{name: 'Aramex', isLetter: false},
{letter: "B", isLetter: true},        // new object
{name: 'Booking', isLetter: false},
{letter: "D", isLetter: true},        // new object
{name: 'Dangerous', isLetter: false},
{letter: "M", isLetter: true},        // new object
{name: 'Manali', isLetter: false}]

我嘗試了reduce()函數,但是我不明白為什么它給了我錯誤的結果:

var newArr = [];
list.reduce(function(prev, cur, index, originalArrray) {
    var previousCharcode = prev.name.toUpperCase().charCodeAt(0);
    currentCharCode = cur.name.toUpperCase().charCodeAt(0);

    newArr.push(prev);
    if(previousCharcode != currentCharCode) {
        newArr.splice(index, 0, {isLetter: true, letter: String.fromCharCode(currentCharCode)});
    }
    return cur;
});

您的代碼沒有給出預期結果的原因至少有兩個:

  • 您使用的索引指向原始數組中的索引。 由於新數組將包含更多元素,因此在新數組上使用該索引進行splice沒有任何意義。 最終它將指向錯誤的位置。

  • 您只需推送prev元素,所以最后一個元素將永遠不會被推送到結果數組

我建議使用帶有累積值(回調的第一個參數)的reduce來建立最終數組。 為了記住引入的最后一個字母對象,我將把這個累加值與那個字母配對。 因此,我將使用包含兩個元素的數組:

  • 最后的數組正在累積
  • 最近添加的字母對象的字母

然后,最終結果將從該數組的第一個元素獲取,而忽略第二個值。

我建議不要使用字符代碼,而只能使用字符。 它使您免於將代碼轉換回字符的麻煩。

這是代碼:

 var list = [ {name: '4 Arn', isLetter: false}, {name: 'Abax', isLetter: false}, {name: 'Aramex', isLetter: false}, {name: 'Booking', isLetter: false}, {name: 'Dangerous', isLetter: false}, {name: 'Manali', isLetter: false} ]; var newArr = list.reduce(function(collect, cur, index, originalArrray) { var currentChar = cur.name.toUpperCase().substr(0,1); if (currentChar < 'A') currentChar = '#'; if (collect[1] != currentChar) { collect[0].push({isLetter: true, letter: currentChar}); collect[1] = currentChar; } collect[0].push(cur); return collect; }, [[], null])[0]; // output console.log(newArr); 

檢查此解決方案。 迭代數組並將其附加到新數組。

 var names = [{ name: '4 Arn', isLetter: false }, { name: 'Abax', isLetter: false }, { name: 'Aramex', isLetter: false }, { name: 'Booking', isLetter: false }, { name: 'Dangerous', isLetter: false }, { name: 'Manali', isLetter: false }]; var newNames = []; for (var i in names) { var char = names[i].name.substring(0, 1); var isNumber = !isNaN(char); var entry = { letter: (isNumber ? '#' : char.toUpperCase()), isLetter: isNumber }; newNames.push(entry); newNames.push(names[i]); } console.log(newNames); 

也許用這種方法可以解決問題

 var list = [{name: '4 Arn', isLetter: false}, {name: 'Abax', isLetter: false}, {name: 'Aramex', isLetter: false}, {name: 'Booking', isLetter: false}, {name: 'Dangerous', isLetter: false}, {name: 'Manali', isLetter: false}]; var listResult = []; list.map(function(item, index) { if(index > 0) { var currentCharcode = item.name.toUpperCase().charCodeAt(0); var previousCharcode = list[index-1].name.toUpperCase().charCodeAt(0); if(previousCharcode != currentCharcode) { listResult.push({isLetter: true, letter: String.fromCharCode(currentCharcode)}); } } else { listResult.push({isLetter: true, letter: String.fromCharCode(currentCharcode)}); } listResult.push(item); }); console.log(JSON.stringify(listResult)); 

我想您也可以通過這樣的功能方式進行操作;

 var arr = [{name: '4 Arn', isLetter: false}, {name: 'Abax', isLetter: false}, {name: 'Aramex', isLetter: false}, {name: 'Booking', isLetter: false}, {name: 'Dangerous', isLetter: false}, {name: 'Manali', isLetter: false}], table = arr.reduce((p,c) => {var firstLetter = c.name[0]; isNaN(+firstLetter) ? p[firstLetter] ? p[firstLetter].push(c) : p[firstLetter] = [c] : p["#"] ? p["#"].push(c) : p["#"] = [c]; return p; },{}), result = Object.keys(table).reduce((p,k) => p.concat({letter: k, isLetter: true},table[k]),[]); console.log(result); 

提示:+“ A”返回NaN,但+“ 4”返回4作為數字。 因此, isNaN()是檢查類型的非常有用的函數。

這是具有常規功能而不是箭頭的版本;

 var arr = [{name: '4 Arn', isLetter: false}, {name: 'Abax', isLetter: false}, {name: 'Aramex', isLetter: false}, {name: 'Booking', isLetter: false}, {name: 'Dangerous', isLetter: false}, {name: 'Manali', isLetter: false}], table = arr.reduce(function(p,c){ var firstLetter = c.name[0]; isNaN(+firstLetter) ? p[firstLetter] ? p[firstLetter].push(c) : p[firstLetter] = [c] : p["#"] ? p["#"].push(c) : p["#"] = [c]; return p; },{}), result = Object.keys(table).reduce(function(p,k){ return p.concat({letter: k, isLetter: true},table[k]); },[]); console.log(result); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM