2016-09-04 3 views
0

Я хочу реализовать функцию, возвращающую массив значений свойств, если значение является примитивным (не объект или массив), а имя свойства начинается с префикса.JavaScript: только значения возвращаемого значения

Например

var values = function (obj, prefix) { ... } 

var testObj = { 
    'a': 1, 
    'ab': [ 
     { 
      'c': 2, 
      'ac': true 
     } 
    ] 
}; 

В результате values(testObj, 'a') вызова функции я ожидаю получить такой массив примитивов: [1, true].

Вот моя попытка:

var values = function (obj, prefix) { 
    var res = []; 

    for (var i in obj) { 
     if (i.startsWith(prefix)) { 
      var v = obj[i]; 

      if (typeof v === 'object') { 
       var r0 = arguments.callee(v, prefix); 
       res.push(r0); 
      } else { 
       res.push(v); 
      } 
     } 
    } 

    return res; 
}; 

Но он возвращает неправильный результат: [1, []]. Как я могу это исправить?

+0

, пожалуйста, добавьте желаемый результат. –

+0

@NinaScholz '[1, true]' – Finkelson

+1

Почему вы хотите получить избыточную информацию после того, как вы вернетесь с 1, что является точкой «истины» – Redu

ответ

0

Вы можете использовать рекурсивный подход для значений, которые вам нужны.

function values(obj, prefix) { 
 
    var result = []; 
 
    Object.keys(obj).forEach(function (k) { 
 
     if (obj[k] !== null && typeof obj[k] === 'object') { 
 
      result = result.concat(values(obj[k], prefix)); 
 
     } else if (k.startsWith(prefix)) { 
 
      result.push(obj[k]); 
 
     } 
 
    }); 
 
    return result; 
 
} 
 

 
var testObj = { 'a': 1, 'ab': [{ 'c': 2, 'ac': true }] }, 
 
    result = values(testObj, 'a'); 
 
\t 
 
console.log(result);

0

(Мой город энергия слаба.)

Где главная проблема находится в состоянии i.startsWith(prefix). Это позволяет вам вводить объект без имени свойства, включая @prefix внутри массива. Например:

{ a: 1, ab: [ /* 0: { 'c': 2, 'ac': true } */ ] } 

Как вы видите, объект в массиве игнорируется, так как его имя свойства 0, это его индекс.

Если вы действительно хотите получить такой результат: [1, true] вам нужно будет пропустить массив и вернуть первый элемент в res.push.

var values = function (obj, prefix) { 
    var res = []; 

    for (var i in obj) { 
     if (i.startsWith(prefix)) { 
      var v = obj[i]; 

      if (typeof v === 'object') { 
       var isArray = v instanceof Array; 
       var r0 = arguments.callee(isArray ? v[0] : v, prefix); 
       res.push(isArray && r0.length === 1 ? r0[0] : r); 

      } else { 
       res.push(v); 
      } 
     } 
    } 

    return res; 
}; 
0

Работает следующий код.

var testObj = { 
    'a': 1, 
    'ab': [ 
    { 
     'c': 2, 
     'ac': true 
    } 
    ] 
}; 

var values = function (obj, prefix) { 
    var res = []; 

    if(Array.isArray(obj)){ 
     for(var j in obj){ 
     res = res.concat(arguments.callee(obj[j], prefix)); 
     } 
    } 
    else if(typeof obj == "object") { 
     for (var i in obj) { 
     if (i.startsWith(prefix)) { 
      var v = obj[i]; 

      if (typeof v === 'object') { 
      res = res.concat(arguments.callee(v, prefix)); 
      } else { 
      res.push(v); 
      } 
     } 
     } 
    } 

    return res; 
}; 

console.log(values(testObj, 'a')); 
0

Это может быть то, что вы ищете;

var testObj = { 
 
       'a': 1, 
 
       'ab': [ 
 
         { 
 
         'c': 2, 
 
         'ac': true 
 
         } 
 
        ] 
 
       }; 
 
    getValues = (o,x) => Object.keys(o) 
 
          .reduce((p,k) => p.concat(typeof o[k] === "object" ? getValues(o[k],x) 
 
                       : k.indexOf(x) >= 0 ? o[k] 
 
                            : []) 
 
            ,[]); 
 
console.log(getValues(testObj,"a"));

-1
var testObj = { 
    'a': 1, 
    'ab': [ 
    { 
     'c': 2, 
     'ac': true 
    } 
    ] 
}; 
var res = []; 
var values = function (obj, prefix) { 
    for (var i in obj) { 
    var v = obj[i]; 
    //Prefix check line can be moved here if you want to check the prefix for object 
    if (typeof v === 'object') { 
     arguments.callee(v, prefix); 
    } else { 
     if (i.startsWith(prefix)) { //Prefix Check 
      res.push(v); 
     } 
    } 
    } 
    return res; 
}; 
console.log(values(testObj,'a')); 

Пожалуйста, проверьте это, это дает результат, который вы хотели.

Смежные вопросы