从解析的对象返回字符串和数字的数组

时间:2018-01-20 19:20:32

标签: javascript arrays function object duplicates

尝试创建一个函数,通过将数组值作为键添加到对象,然后将键推送到结果数组,从字符串,数字和布尔数组中删除重复项。我知道我可以用回调和#34; .filer"更快更干净地写它。 /" .indexOf"但是我试图在没有它的情况下写它。

const removeDuplicates = (arr) => {
  let result = [];
  let obj = {};
  for(let i = 0; i < arr.length; i++) {
    obj[arr[i]] = "";
  }
  for(key in obj) {
    if(typeof key === 'number'){
      result.push(parseInt(key));
    }else{
      result.push(key);
    }
  }
  return result;
}

const myArr = [1,2,2,"hello","hello",3,3,"goodbye","goodbye",4,4,4,true,true,5,5];
console.log(removeDuplicates(myArr));

此函数返回:

["1", "2", "3", "4", "5", "hello", "goodbye", "true"]

我期待:

[1, 2, 3, 4, 5, "hello", "goodbye", "true"];

不确定为什么我的&#34; parseInt&#34;不工作。我怀疑它与我如何使用&#34; typeOf&#34;有关。或者当我将数组值添加到对象时,它们将作为字符串保存在对象键中。任何帮助表示赞赏。

6 个答案:

答案 0 :(得分:0)

const myArr = [1,2,2,"hello","hello",3,3,"goodbye","goodbye",4,4,4,true,true,5,5];
let obj = {}
const newArr = myArr.reduce((arr, item) => {
    if(!object.hasOwnProperty(item)){
        object[item] = 0;
        arr.push(item);
    }
    return arr;
}, []);

console.log(newArr) //[1, 2, "hello", 3, "goodbye", 4, true, 5];

如果订单很重要,您可以return arr.sort()

答案 1 :(得分:0)

您检查对象的密钥,这始终是一个字符串,检查不起作用,但您可以将值转换为数字并返回字符串并使用密钥进行检查。如果true,则您有一个数值。

 const removeDuplicates = (arr) => {
    let result = [];
    let obj = {};
    for (let i = 0; i < arr.length; i++) {
        obj[arr[i]] = "";
    }
    for (key in obj) {
        if ((+key).toString() === key) {
            result.push(+key);
        } else {
            result.push(key);
        }
    }
    return result;
}

const myArr = [1, 2, 2, "hello", "hello", 3, 3, "goodbye", "goodbye", 4, 4, 4, true, true, 5, 5];
console.log(removeDuplicates(myArr));

仅为了记录,您可以使用Set,这会产生独特的结果。

const
    array = [1, 2, 2, "hello", "hello", 3, 3, "goodbye", "goodbye", 4, 4, 4, true, true, 5, 5],
    unique = [...new Set(array)];
    
console.log(unique); // in order of appearance

答案 2 :(得分:0)

首先,您的这种情况if(typeof key === 'number')永远不会得到满足,它们都是string类型。

其次,而不是写整个块

for(key in obj) {
    if(typeof key === 'number'){
      result.push(parseInt(key));
    }else{
      result.push(key);
    }
  }
  return result;

您可以返回Object.keys(obj)

现在,您想要检查字符串与数字,只需执行(+index).toString() === index)

答案 3 :(得分:0)

它运作正常:

  const removeDuplicates = (arr) => {
  let result = [];
  let s = new Set()
  for (key in arr)
  {
    if (!s.has(arr[key])) {
        result.push(arr[key])
        s.add(arr[key])
    }
  }
  return result;
}

答案 4 :(得分:0)

您可以使用对象Set中内置的JavaScript来保留任何类型的唯一值。 这是代码的外观。

function removeDuplicates(arr){
    let result = Array.from(new Set(arr))
    return result;
}

const arr = [1,2,2,"hello","hello",3,3,"goodbye","goodbye",4,4,4,true,true,5,5];
console.log(removeDuplicates(arr));

这将为您提供预期的结果。 让我知道它是否有效。 :)

答案 5 :(得分:0)

const removeDuplicates = (arr) => {
        let result = [];
        let obj = {};
        for(let i = 0; i < arr.length; i++) {
            obj[arr[i]] = "";
        }
        for(key in obj) {
            if(isNaN(+key)){
                result.push(key);
            }else{
                result.push(+key);
            }

        }
        return result;
    }

    const myArr = [1,2,2,"hello","hello",3,3,"goodbye","goodbye",4,4,4,true,true,5,5];
    console.log(removeDuplicates(myArr));

typeOf“2”将返回字符串而不是数字,这就是为什么你的代码不能正常工作。你需要尝试将其解析为int然后再决定。 希望这会有所帮助!!!